最近公司开发新项目,于是便使用GreenDao做数据持久化,毕竟第一次正式在项目中使用,特此记录下使用中碰到的两个坑。
一.前言
公司准备开发一个新项目,由于项目中需要用到数据持久化,所以便开始挑选合适的方案,目前最稳定的当然是sqlite了,但是近闻realm比较火,使用起来也比较方便,所以决定大胆尝试一次。但是最终集成开发后用了两天便弃坑了,后来才发现原来网上也有大部分相同感受的人。
后来决定还是重新使用稳定的sqlite方案,就开始选择开源的ORM类库,GreenDao无论是在效率还是使用上都是较优的,所以选择了它。看了下github的主页原来版本已经到3.x的时代了,网上查阅了下相关教程原来集成和使用上也变得更便捷,于是拿起键盘就开始干了!
二.踏坑之旅
GreenDao3.x的具体使用我就不介绍了,网上也有很多相关教程,特此记录项目开发中碰到的两个坑
1.一定要有一个类型为Long的主键
如果你的对象需要用到update,那么建议你一定要设置一个Long型的主键
是Long不是long
1 | @Id(autoincrement = true) |
因为如果要update必须要查询出对象,然后通过set方法设置参数的值,最后通过dao.update(bean); 方法更新,但是这个对象必须要有一个主键,且如果为自增长的话则必须为Long.
2.令人又爱又恨的查询缓存
项目中有一个需求是需要先将一张表修改后查询出最新集合对象,但是当我先update表之后,调用query方法查询,当场就懵逼了,竟然不是最新的数据,调取出数据库的db文件查看update已经成功,可是为什么就是查询出的结果不对呢,被这个问题困扰了一个下午。
几经波折,又细细的看了下类库的源码,各种谷歌百度,终于找到了问题的原因(= =!也可能是第一用,太小白了!),原来GreenDao 的Session会将第一次query的结果缓存起来,后面如果调用相同的查询语句则会直接显示缓存的对象(当我发现这个原因之后内心的OS是,原来高效的查询不是这么容易办到的,果然人生处处是坑!!!)
找到原因之后要解决问题就简单了,方法有两种:
(1)在每次查询更新的表之前调用一下清除缓存1
mDaoSession.clear(); // 清除缓存
(2)初始化session的时候直接使用无缓存模式1
mDaoSession = mDaoMaster.newSession(IdentityScopeType.None);
三.总结
获取第一次使用GreenDao3.x各方面相关方法没掌握才入坑,特此记录下来方便以后出现同样问题的同学查阅