SQLite onUpgrade有4个数据库版本

时间:2015-02-05 08:23:02

标签: android sqlite

当我们有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);

    }
}

3 个答案:

答案 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