当我们有4个数据库版本并且我们在每个版本的用户表中添加了一个新字段时,如何正确执行SQLiteOpenHelper的onUpgrade方法?
变式A://否#34;休息"在每个案例之后,它是否继续运行案例2和3?
public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
switch (version_old) {
case 1:
database.execSQL(addPostcodeFieldToUserTable);
case 2:
database.execSQL(addGenderFieldToUserTable);
case 3:
database.execSQL(addEmailSubscriptionFieldToUserTable);
break;
}
}
变式B:
public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
switch (version_old) {
case 1:
database.execSQL(addPostcodeFieldToUserTable);
break;
case 2:
database.execSQL(addPostcodeFieldToUserTable);
database.execSQL(addGenderFieldToUserTable);
break;
case 3:
database.execSQL(addPostcodeFieldToUserTable);
database.execSQL(addGenderFieldToUserTable);
database.execSQL(addEmailSubscriptionFieldToUserTable);
break;
}
但是,当用户拥有数据库版本1,然后错过版本2并使用版本3升级应用程序时,我们该怎么办?
变式3:
public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
if(version_old==1 && current_version==2) {
database.execSQL(addPostcodeFieldToUserTable);
} else if(version_old==2 && current_version==3) {
database.execSQL(addGenderFieldToUserTable);
} else if(version_old==3 && current_version==4) {
database.execSQL(addEmailSubscriptionFieldToUserTable);
} else if(version_old==1 && current_version==3) {
database.execSQL(addPostcodeFieldToUserTable);
database.execSQL(addGenderFieldToUserTable);
} else if(version_old==1 && current_version==4) {
database.execSQL(addPostcodeFieldToUserTable);
database.execSQL(addGenderFieldToUserTable);
database.execSQL(addEmailSubscriptionFieldToUserTable);
} else if(version_old==2 && current_version==4) {
database.execSQL(addGenderFieldToUserTable);
database.execSQL(addEmailSubscriptionFieldToUserTable);
}
}
答案 0 :(得分:3)
你还可以做的是让onUpgrade成为一个递归调用,
public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
switch (version_old) {
case 1:
database.execSQL(addPostcodeFieldToUserTable);
onUpgrade(database,version_old++,current_version);
break;
case 2:
database.execSQL(addPostcodeFieldToUserTable);
database.execSQL(addGenderFieldToUserTable);
onUpgrade(database,version_old++,current_version)
break;
default:
break;
}
你明白了,所以它会升级到最新版本并退出调用自己。
答案 1 :(得分:2)
每个案例后没有“中断”,它是否继续运行案例2和3?
是。通常的做法是添加评论,如
// fallthrough
表示缺少break
是故意的。
但是,当用户拥有数据库版本1,然后错过版本2并使用版本3升级应用程序时,我们该怎么办?
onUprade()
将使用oldVersion
1和newVersion
进行调用3.代码应将数据库更新为您的架构的第3版。
使用哪种变体取决于哪种变体最适合您维护。我个人会使用变体A之类的东西,因为它的代码最少。
答案 2 :(得分:1)
使用不含switch
的{{1}}是违反直觉的。
常见的模式是使用一系列break
代替:
if