继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

慕UI4062818
关注TA
已关注
手记 348
粉丝 97
获赞 553

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没有涉及到数据库升级更新,所以不是很复杂

原文出处

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP