天天看点

GreenDAO在项目中使用 配合完成自动补全完成搜索

1.前言

项目中需要做一个类似“即时搜索”功能,比如

GreenDAO在项目中使用 配合完成自动补全完成搜索

当然我们的需求不一样,所以不能用

AutoCompleteTextView

完成需求,并且我们在实际项目中也很少使用它来完成功能,体验 效果实在不咋地。

可以看看我使用 数据库完成的效果。

GreenDAO在项目中使用 配合完成自动补全完成搜索

不管从搜索速度 还是准确性 还是 UI 设计上都符合要求。具体完成思路:

准备好一个集合,将数据循环遍历插入到数据库表中,然后监听 EditTextView 获取搜索关键字,写一个模糊搜索的 sql 语句,将搜索出来的结果集合显示在列表中,同时刷新界面即可。

这里操作数据库我使用的框架是 GreenDAO ,毕竟不管是插入数据 还是 搜索获取集合,自己写都要不断的循环遍历,太繁琐。列表采用 Recyclerview,不是本次重点。

2.使用GreenDAO

1.在根 .gradle 在如下位置 配置好如下代码

mavenCentral() // add repository
 classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
           
GreenDAO在项目中使用 配合完成自动补全完成搜索

2.在要使用GreenDAO的moduel 的 .gradle 下配置好代码

GreenDAO在项目中使用 配合完成自动补全完成搜索
GreenDAO在项目中使用 配合完成自动补全完成搜索

特别要注意 代码的放置位置,这里一般我们是在 app .gradle 下

apply plugin: 'org.greenrobot.greendao' // apply plugin

greendao {
    schemaVersion  //数据库版本号
    daoPackage 'com.kstar.test.db'// 设置DaoMaster、DaoSession、Dao 包名
    targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
}

 compile 'org.greenrobot:greendao:3.2.2' // add library
           
上面配置完后,同步可能会报如下错误

导致原因是你项目的 gradle 版本太低

distributionUrl=https\://services.gradle.org/distributions/gradle-.-all.zip
           

换成

distributionUrl=https\://services.gradle.org/distributions/gradle--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没有涉及到数据库升级更新,所以不是很复杂

继续阅读