学习目标:
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.新建第一个列表由于在创建数据库出错太多了,浪费了很多时间,没有继续卸载去了。明日再来创建列表。