为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Android

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

原文出处

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消