美文网首页资料 | 汇总Android知识Android开发
记录一次GreenDao3.x踏坑之旅——或许你也会碰上

记录一次GreenDao3.x踏坑之旅——或许你也会碰上

作者: 磊_lei | 来源:发表于2017-01-21 12:13 被阅读305次

    最近公司开发新项目,于是便使用GreenDao做数据持久化,毕竟第一次正式在项目中使用,特此记录下使用中碰到的两个坑。

    一.前言

    公司准备开发一个新项目,由于项目中需要用到数据持久化,所以便开始挑选合适的方案,目前最稳定的当然是sqlite了,但是近闻realm比较火,使用起来也比较方便,所以决定大胆尝试一次。但是最终集成开发后用了两天便弃坑了,后来才发现原来网上也有大部分相同感受的人。
    后来决定还是重新使用稳定的sqlite方案,就开始选择开源的ORM类库,GreenDao无论是在效率还是使用上都是较优的,所以选择了它。看了下github的主页原来版本已经到3.x的时代了,网上查阅了下相关教程原来集成和使用上也变得更便捷,于是拿起键盘就开始干了!

    二.踏坑之旅

    GreenDao3.x的具体使用我就不介绍了,网上也有很多相关教程,特此记录项目开发中碰到的两个坑

    1.一定要有一个类型为Long的主键

    如果你的对象需要用到update,那么建议你一定要设置一个Long型的主键

    是Long不是long

    @Id(autoincrement = true)
    private Long id;                      // 设置id为主键并自增长
    

    因为如果要update必须要查询出对象,然后通过set方法设置参数的值,最后通过dao.update(bean); 方法更新,但是这个对象必须要有一个主键,且如果为自增长的话则必须为Long.

    2.令人又爱又恨的查询缓存

    项目中有一个需求是需要先将一张表修改后查询出最新集合对象,但是当我先update表之后,调用query方法查询,当场就懵逼了,竟然不是最新的数据,调取出数据库的db文件查看update已经成功,可是为什么就是查询出的结果不对呢,被这个问题困扰了一个下午。

    几经波折,又细细的看了下类库的源码,各种谷歌百度,终于找到了问题的原因(= =!也可能是第一用,太小白了!),原来GreenDao 的Session会将第一次query的结果缓存起来,后面如果调用相同的查询语句则会直接显示缓存的对象(当我发现这个原因之后内心的OS是,原来高效的查询不是这么容易办到的,果然人生处处是坑!!!)

    找到原因之后要解决问题就简单了,方法有两种:
    (1)在每次查询更新的表之前调用一下清除缓存

    mDaoSession.clear();      // 清除缓存
    
    清除缓存

    (2)初始化session的时候直接使用无缓存模式

    mDaoSession = mDaoMaster.newSession(IdentityScopeType.None);
    
    无缓存模式

    三.总结

    获取第一次使用GreenDao3.x各方面相关方法没掌握才入坑,特此记录下来方便以后出现同样问题的同学查阅

    相关文章

      网友评论

      • Avalon1:正好新项目要用GreenDao。记下了

      本文标题:记录一次GreenDao3.x踏坑之旅——或许你也会碰上

      本文链接:https://www.haomeiwen.com/subject/icngbttx.html