问题
手机中使用sqlite数据库存储数据,假设当前数据库版本5,现在有6个人,每个人的手机中如下部署,未安装、版本1,版本2,版本3,版本4,版本5。如果已经安装的APP版本中都包含用户数据。sqlite库支持migrate升级。
有以下两个函数func OnCreate();当应用新安装时调用,func OnUpgrade(old version,now version);当数据库存在时调用,其中old指当前手机安装的App数据库版本,now指当前要新应用中的数据库版本。
现在新应用版本为6,其中的脚本分别为:ver1,ver2,ver3,ver4,ver5,ver6。
请问,怎么实现数据库逻辑,不删除用户数据,能够进行顺利升级?
答案1
分析,onCreate中调用数据库执行(ver1,ver2,ver3,ver4,ver5,ver6)。onUpgrade中调用就需要根据已安装应用的脚本进行判断。使用多个if 语句或switch语句执行。例如
func onCreate(){
ver1,ver2,ver3,ver4,ver5,ver6
}
func onUpgrade(old version,now version){
if(old==1){
ver2,ver3,ver4,ver5,ver6
}
if(old==2){
ver3,ver4,ver5,ver6
}
if(old==3){
ver4,ver5,ver6
}
if(old==4){
ver5,ver6
}
if(old==5){
ver6
}
}
答案2
我们可以看到,答案1中可以实现,思路也比较简单,但是这里有一个问题,每次新增加数据库版本是,需要改动的地方太多。有没有更方便的方法呢?
我们使用一个map存储数据库升级脚本,然后根据当前已安装应用的版本进行判断。例如
// Map中存储key value,key为int,value为字符串
versionMap = Map(int)String {
1:ver1,
2:ver2,
3:ver3,
4:ver4,
5:ver5,
6:ver6,
}
// vlen 为Map的长度或项目数量
int vlen = versionMap.length
func onCreate(){
// i 从1开始,因为Map中key最小为1
for(int i=1;i <=vlen;i++){
exec(versionMap[i]) // 执行数据库脚本
}
}
func onUpgrade(old version,now version){
// 这里old+1表示只执行新应用升级脚本
for(int i=old+1;i<=vlen;i++){
exec(versionMap[i]) // 执行数据库脚本
}
}
通过这个例子,我们在新增数据库版本时,只需要在Map中新增即可。其它函数不用变动。