最近有个项目要实现离线功能。一开始Leader想用Firebase里的Firebase Realtime Database来实现,但考虑到客户端储存数据量太大等问题,最终还是采用客户端建数据库,通过调用api同步服务器数据的方法来实现离线功能。 我的项目是用kotlin+jetpack来写的,本来想用Jetpack全家桶Room这个数据库框架的,但Room在数据库升级时需要自己手写SQL语句来处理冲突和保存数据,鉴于我对SQL不太熟悉,项目时间又比较赶,思虑再三还是打算用Greendao来实现,下面我简单记录一下在用这个框架时遇到的坑及注意事项。
- 新建实体类之前一定要先想好要建些什么字段,以及字段对应的数据类型。建实体类时要注意
@id声明的就是table的主键,一定要是Long类型的,如果写成小写的long设置自增属性会有问题。还有就是实体类中包含其它对象或者数组,一定要用@Transient或@ToMany以及@ToOne来声明,不然build会报错。 - 实体类建完build成功后,GreenDao会自动在实体类中生成所有变量的getter()和setter()方法,这里面又有坑。因为我的项目有时候是读取本地数据来显示,有时候是从服务器获取数据来显示,实体类都用的同一个,而GreenDao自动生成的getter()方法是从数据库去读取数据,所以当获取服务器的返回数据时,需要自己手动写一个正常的getter()方法来获取数据。
- GreenDao查询过的数据会通过session临时缓存下来,除非退出APP,不然session会一直存在,这会导致你在下次调用查询方法时插入重复数据导致数据混乱。这时就需要调用这两个方法来清除缓存:
DbManager.getDaoSession(context).clear()//清除所有缓存
DbManager.getDaoSession(context).XXDao.detachAll()//清除对应Dao生成的缓存
- 每次修改完实体类,需要去build.gradle文件中去更新数据库的版本号,GreenDao会重新生成Dao文件。
- 当实体类里没有
@id或者@unique的声明字段时,update该实体类对象时会报错。