Android客户端SQLite数据库升级方案
一,前言
没有采用Android自身提供的那一套数据库操作方式。而是想对SQLite数据库文件有更全面的控制,包括随时导出数据库文件修改表结构,增删数据等等。这样一来虽然在开放中得到不少便利,但是也带来了数据库升级的一些问题。
后来不得已采用了一种方案,可以解决问题,现将方案的全部实现细节记录下来。最后也会提出一些我认为有问题的地方。
?
二,数据库文件拷贝
程序不负责数据库的创建,SQLite数据库文件是在外部创建好的。程序启动阶段拷贝进SD卡。以达到对数据库结构的全面控制。
数据库文件存放位置见附件图片。
?其中有几个要点:
1、检测数据库文件是否已经存在。不存在则从raw文件夹复制数据库文件拷贝至SD卡中指定目录。
2、数据库版本是根据应用的versionCode相同。拷贝数据库后,会把当前versionCode写入数据库的表中。
?versionCode在AndroidManifest.xml文件中。
在这种方案下,实际上是由versionCode控制数据库版本,versionName控制程序版本。
3、SD卡指定目录已经存在数据库文件的情况,则读取其中保存的数据库版本号,与versionCode对比,从而确定是否需要升级数据库。代码如下:
?
4、写入当前数据库版本,即从程序获得的versionCode。
5、删除原数据库文件,重命名temp.db。
完整过程如下:
?至此,整个数据库升级完成。在保留原数据的基础上,获取了新的数据库结构。
?
四,问题
1,需要保留的原数据与新表结构不符。这个可以在程序中控制,创建新的OR映射。
2,效率问题,如果需要保留的数据量非常大的情况下,是否会出现问题。这个是亟待解决的,目前我还没有想到解决办法。
?
五,总结
这个方案针对的情况是外部创建数据库文件,程序启动时从apk包将数据库文件拷贝进SD卡,从而达到对数据库文件的完全控制。
方案步骤:
1,检测是否需要升级数据库文件。数据库文件版本是由versionCode控制。程序升级时,如果需要升级数据库,则要将versionCode+1。
2,将新数据库文件(存在于apk中),写入SD卡。
3,转移数据。
4,删除原数据库文件,重命名新数据库文件。
5,向新数据库写入当前数据库版本。