数据库版本升级逻辑解析
发布于 4 年前 作者 fangfan 366 次浏览 来自 分享

问题

手机中使用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中新增即可。其它函数不用变动。

回到顶部