学习日志

学习目标:

1.要求使用SQLite数据库保存通讯录,使得每次运行程序均能显示当前联系人的列表
2.主界面包含一个添加联系人按钮和一个联系人列表
点击添加联系人按钮能添加新的联系人。
3.对数据库进模糊查询

学习内容:

1.使用OrmLite数据库要去下载jar包

implementation files('libs/ormlite-android-5.0.jar')
implementation files('libs/ormlite-core-5.0.jar')

2.创建数据库DatabaseHelper

package com.example.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;

import java.sql.SQLException;

/**
 * 定义数据库的工具类,继承OrmLiteSqliteOpenHelper类,重写 onCreate\onUpgrade方法
 */
public class DatabaseHelper  extends OrmLiteSqliteOpenHelper{


    public static final String DB_NAME = "mydb.db";
    public static  final int version = 1;

    public DatabaseHelper(Context context){
        super(context,DB_NAME,null,version);
    }

    /**
     * 定义访问表dict的对象
     */
    public Dao<Dict,Integer> dictDao;

    /**
     * 返回表dict的操作对象
     * @return
     * Dao  :database access operate
     */
    public Dao<Dict,Integer> getDictDao(){
        if(dictDao ==null){
            try {
                /**
                 * 通过getDao获取访问某个表的对象,传递的注解的实体类
                 */
                dictDao =getDao(Dict.class);
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }

        return dictDao;

    }


    //第一次创建数据库时调用
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
        //创建相应的表
        try {
            /*
            通过createTable方法创建表
            参数1:连接源
            参数2:要创建的表(带注解的实体类)
             */
            TableUtils.createTable(connectionSource, Dict.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    /**
     * 数据库升级时调用
     * @param sqLiteDatabase
     * @param connectionSource
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        if (newVersion>oldVersion){
            try {
                //通过dropTable删除表
                /**
                 * 参数说明
                 * 参数1:数据库的连接源
                 * 参数2:要删除的表(标注了的实体类)
                 * 参数3:删除出错时是否 要删除表
                 */
                TableUtils.dropTable(connectionSource,Dict.class,true);
                //createTableIfNotExists 如果表不存在,才创建表
                TableUtils.createTableIfNotExists(connectionSource,Dict.class);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}


3.写入监听器,并插入数据

package com.example.myapplication;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.QueryBuilder;

import java.sql.SQLException;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    //定义控件
    private EditText edtWord;
    private EditText edtInterpret;
    private Button btnInsert;
    private Button btnRead;
    private Button btnQuery;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_orm);
        Log.v("test","one");
        //初始化控件
        edtWord = (EditText) findViewById(R.id.edt_word);
        edtInterpret = (EditText) findViewById(R.id.edt_interpret);
        btnInsert = (Button) findViewById(R.id.btn_insert);
        btnRead = (Button) findViewById(R.id.btn_read);
        btnQuery = (Button) findViewById(R.id.btn_query);
        //绑定点击事件
        btnInsert.setOnClickListener(this);
        btnRead.setOnClickListener(this);
        btnQuery.setOnClickListener(this);

    }

    private DatabaseHelper dbHelper;

    @Override
    public void onClick(View view) {
        if (dbHelper==null){
            dbHelper = new DatabaseHelper(MainActivity.this);
        }
        int id = view.getId();
        switch (id){
            case R.id.btn_insert:
                //插入数据
                String word  = edtWord.getText().toString();
                String interpret = edtInterpret.getText().toString();
                //获取操作表的dao对象
                Dao<Dict,Integer> dictDao = dbHelper.getDictDao();
                //插入对应的数据
                Dict dict = new Dict();
                dict.setWord(word);
                dict.setInterpret(interpret);

                try {
                    //通过操作实体对象的形式将数据插入到表中
                    dictDao.createIfNotExists(dict);
                } catch (SQLException e) {
                    e.printStackTrace();
                }


                break;
            case R.id.btn_read:
                //读取数据
                Dao<Dict ,Integer> dictList = dbHelper.getDictDao();
                try {
                    List<Dict> dictDataList =  dictList.queryForAll();

                    StringBuffer strBuffer = new StringBuffer();
                    for(int i =0;i<dictDataList.size();i++){
                        strBuffer.append("第"+i+"位置的word="+dictDataList.get(i).getWord()+";单词的含义"+dictDataList.get(i).getInterpret()+"\n");
                    }

                    Toast.makeText(MainActivity.this, strBuffer.toString(), Toast.LENGTH_SHORT).show();

                } catch (SQLException e) {
                    e.printStackTrace();
                }

                break;

            case R.id.btn_query:
                //查询数据
                Dao<Dict,Integer> dictWhereDao = dbHelper.getDictDao();
                //获取对应表或实体的查询构造者
                QueryBuilder<Dict,Integer> queryBuilder  = dictWhereDao.queryBuilder();
                try {
                    queryBuilder.selectColumns(new String[]{"tword","interpret"}).where().like("tword","%af%")
                            .or().like("tword","%AF%");
                    queryBuilder.orderBy("tword",true);
                    //执行查询
                    List<Dict> dictWhereList = queryBuilder.query();
                    StringBuffer strBuffer = new StringBuffer();
                    for(int i =0;i<dictWhereList.size();i++){
                        strBuffer.append("第"+i+"位置的word="+dictWhereList.get(i).getWord()+";单词的含义"+dictWhereList.get(i).getInterpret()+"\n");
                    }
                    Toast.makeText(MainActivity.this, strBuffer.toString(), Toast.LENGTH_SHORT).show();

                } catch (SQLException e) {
                    e.printStackTrace();
                }


                break;
        }
    }
}

4.新建第一个列表由于在创建数据库出错太多了,浪费了很多时间,没有继续卸载去了。明日再来创建列表。

上一篇:jdbc--Mysql异常问题总结


下一篇:抽象工厂模式在源码中的使用