还记得刚开始学Android那会,使用SQLiteOpenHelper来操作SQLite数据库,然后第一个APP开发就频繁地使用其将数据本地化处理,结果呢?真心是自讨苦吃,各种问题让我烦不胜烦:数据刷新不及时啦,本地数据和后台数据同步问题啦,业务一复杂代码各种乱七八糟···
总之第一个APP开发中因为使用SQLite给我留下了较深的阴影,故此在之后的APP开发中,我几乎没再使用SQLite了,后来想想,这也得益于网络的提速,流量费的降低等外部原因,所以不用也没什么影响。
但是,老话说得好:存在即合理!既然Android有这个玩意,那么肯定有其使用场景的,只不过那会我初学瞎用而已,今天我们就以greenDAO这个数据库框架入手,再来聊聊数据本地化的问题。
关于greenDAO嘛,首先当然是要看看文档了:
GitHub项目地址
greenDAO官方文档
然后我们从官方文档中找到这两张图,可以更直观的了解greenDAO所处的位置及关系,第二张图列举了几个常用ORM关系型数据库框架性能对比,很明显greenDAO性能上远优于其它框架。
greenDAO除了性能上有很大的优势外,还十分易用,基本上按着流程走就妥妥的了,方便快捷,比原来用SQLiteOpenHelper和SQLiteDatabase快了很多,也少写了很多代码,关于如何使用笔者在这里并不想过多的进行介绍,相关可参考:
https://www.cnblogs.com/whoislcj/p/5651396.html
https://blog.csdn.net/qq_30379689/article/details/54410838
接下来才是我想说的:
1)虽然greenDAO提供了@ToOne和@ToMany这样的关系注解,用于解决一对一和一对多的表关系问题,但是,有时候我们并不想建那么多张表,又或者bean类里相应关系用的是静态内部类,这时,我们可以使用下面注解:
@Convert(converter = XXX.class, columnType = String.class)
意思就是编写一个 XXX.class继承于PropertyConverter,在这个类里完成数据的转换,确保存进数据库里的是String类型,取出来又转换为你需要的类型,这样有时能带来不少方便。
2)跟其他第三方框架一样,greenDAO也有其混淆规则,否则打包会出错,这些都在官方文档有说明,在此copy一份记录一下:
### greenDAO 3
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**
# If you do not use RxJava:
-dontwarn rx.**
3)我们来说说数据本地化的使用场景,算是回答最开始提出的相关问题。
首先,在今时今日到处有WiFi,或无限量流量包等大环境下,数据本地化确实被弱化了,毕竟网速那么快,用户又极少出现没网络状态,而且如果没网络的话,基本上你打开APP也做不了什么事了。
但是,数据本地化还是有其用武之地的,个人认为,数据本地化的目的在于用户体验的优化,更多的时候说白了就是“别让用户等”,明白这个后,我们自然很容易找到其使用场景:
比如一些更改不是很频繁的基础数据或配置数据
比如一些用户本地操作类数据(浏览记录啊,个人收藏啊,个人购物车啊)
比如一些使用超级频繁的数据为减轻服务器压力而必须做的本地化(最典型的IM功能聊天记录)
···
4)我们再来说说数据本地化的使用方法,这里就涉及到本地数据与后台数据的同步问题了,我们分情况进行说明:
A:对于“查”操作,先从本地数据库查数据然后进行界面显示给用户看,同时调用接口访问后台数据,获取数据后与本地进行对比,如果有差异更新本地数据库并刷新界面(如果属于一些更改不是很频繁的配置数据,这里也可做一个优化,并不一定每次都要访问后台数据进行比对,可设置一定的访问频率)
B:对于“增删改”操作,这里又得一分为二
B1:如果这一部分数据非常重要的话,建议使用的顺序为,调用接口进行后台的“增删改”,成功后再进行本地数据库的同步,不成功则将结果反馈给用户
B2:如果这一部分数据不是很重要,换句话说“增删改”的结果并不是非常重要的情况下,我们为了更好的用户体验,可以直接先存本地,本地保存成功后就默认OK了,然后再调用后台接口去更新数据,而至于后台是否更新成功,我们并不关心
C:还有另一种做法,所有“增删改查”操作全部使用本地数据库,然后设置一定的标记位用于标记数据的同步状态(这里需与后台开发人员约定好),定时在后台进行本地数据库与后台数据库的同步操作。(这种做法比较麻烦,而且存在数据丢失或同步不及时等问题,不大建议使用)
D:另外,数据本地化其实也不一定非得自己去存本地数据库,比如现在使用的很多网络请求框架都带有缓存功能,所以有些时候也可直接利用网络请求框架的缓存就行了。
E:需要说明的另一点,数据本地化还得考虑一个安全性的问题,是否需要进行加密操作这也是开发者该考虑的问题。
5)开发中,为了更直接的查看本地数据库的数据,这里推荐一个工具:SQLite编辑器,可直接安装到手机或模拟器上(需root),然后便可直接打开数据库进行数据查看,如下图所示: