GreenDAO在项目中使用 配合完成自动补全完成搜索
1.前言
项目中需要做一个类似“即时搜索”功能,比如
当然我们的需求不一样,所以不能用 AutoCompleteTextView
完成需求,并且我们在实际项目中也很少使用它来完成功能,体验 效果实在不咋地。
可以看看我使用 数据库完成的效果。
不管从搜索速度 还是准确性 还是 UI 设计上都符合要求。具体完成思路:
准备好一个集合,将数据循环遍历插入到数据库表中,然后监听 EditTextView 获取搜索关键字,写一个模糊搜索的 sql 语句,将搜索出来的结果集合显示在列表中,同时刷新界面即可。
这里操作数据库我使用的框架是 GreenDAO ,毕竟不管是插入数据 还是 搜索获取集合,自己写都要不断的循环遍历,太繁琐。列表采用 Recyclerview,不是本次重点。
2.使用GreenDAO
1.在根 .gradle 在如下位置 配置好如下代码
mavenCentral() // add repository
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
2.在要使用GreenDAO的moduel 的 .gradle 下配置好代码
特别要注意 代码的放置位置,这里一般我们是在 app .gradle 下
apply plugin: 'org.greenrobot.greendao' // apply plugin
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'com.kstar.test.db'// 设置DaoMaster、DaoSession、Dao 包名
targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
}
compile 'org.greenrobot:greendao:3.2.2' // add library
上面配置完后,同步可能会报如下错误
Error:Unable to find method 'org.gradle.api.internal.project.ProjectInternal.g
导致原因是你项目的 gradle 版本太低
如
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
换成
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
网上搜了下,据说 至少要 3.3 版本的 gradle
3.同步完没问题后,为 Bean 对象添加 注解,注解后 Bean 每个属性就是表的字段,然后再 Build --> make module app
添加 GreenDAO 注解的方法最主要的是加 @Entity
@Entity
public class TestBean {
}
4.在 Application 下配置 GreenDAO
前面 make module app 后会在 daoPackage 'com.kstar.test.db'// 设置DaoMaster、DaoSession、Dao 包名
下生成三个文件,分别是 TestBeanDao 、DaoMaster、DaoSession,后面两个类是 GreenDAO 核心累,我们需要配置在 application 配置
private DaoSession daoSession;
private Database db;
private void initDao() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "kstar_test");
db = helper.getWritableDb();
DaoMaster daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
}
public DaoSession getDaoSession(){
return daoSession;
}
public Database getDB(){
return db;
}
以后bean类中字段变化了,只需要将 db 包下对应的 beanDao 删除 然后重新 make modele app 即可
可能有人会遇到,两个 bean 之间继承关系,然后 GreenDAO 注解怎样配置的问题,我就碰到这种需求,查了很多资料,解释都没办法,只能重新新建 bean ,去除继承关系, Github 上 issue 也有人问了这个问题,但是 GreenDAO 的开源者貌似也说不能解决,见地址
GreenDAO Bean对象继承关系注解
ok 配置完成 就剩下使用了,简单的使用比较简单,拿到 beanDao 使用各种 api 操作增删改查即可。
本次项目中涉及到 增 删 查,前面两个比较简单,直接奔上查询吧。因为我们的需求是 根据关键字查询集合,并且只有 bean 中的 名称和地址 才能搜到结果
/**
* 根据搜索关键字在数据库表中查询
* @param key
*/
private void getDataFromKey(String key){
List<ChargingSitePlusBean> beanList = chargeSitePlusDao.queryRaw("where owning_site like ? or area_ownership like ?","%"+key+"%","%"+key+"%");
LogUtils.logd(beanList.toString());
if(!CollectionUtils.isNullOrEmpty(beanList)){
adapter.replaceAll(beanList);
}
}
这是关键的方法,首先我们需要写一个 sql 语句查询,但是有了封装,只需要写条件即可,然后对于条件中有几个形参,就用几个问号代替,后面也写几个实参。
好的!到这里完成,这里使用GreenDAO没有涉及到数据库升级更新,所以不是很复杂