Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite onUpgrade具有4个数据库版本_Android_Sqlite - Fatal编程技术网

Android SQLite onUpgrade具有4个数据库版本

Android SQLite onUpgrade具有4个数据库版本,android,sqlite,Android,Sqlite,当我们有4个数据库版本,并且在每个版本的用户表中添加了一个新字段时,如何正确地执行SQLiteOpenHelper的onUpgrade方法 变体A://在每个案例之后都没有“中断”,案例2和案例3是否继续运行 public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) { switch (version_old) { case 1: database.ex

当我们有4个数据库版本,并且在每个版本的用户表中添加了一个新字段时,如何正确地执行SQLiteOpenHelper的onUpgrade方法

变体A://在每个案例之后都没有“中断”,案例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;
    }
但是,如果用户拥有DB的版本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);

    }
}

您还可以将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;
}

你明白了,所以它会升级到最新版本,并停止调用自己

您还可以将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;
}
你明白了,所以它会升级到最新版本,并停止调用自己

每个案例之后都没有“中断”,案例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;
    }
}
对。一种常见的做法是添加如下注释

// fallthrough
表示缺失的
中断是故意的

但是,如果用户拥有DB的版本1,但错过了版本2,并用版本3升级了应用程序,我们该怎么办

onUprade()
将使用
oldVersion
1和
newVersion
3调用。代码应将数据库更新为模式的版本3

使用哪种型号取决于哪种型号最适合您维护。我个人会选择变体A,因为它的代码最少

每个案例之后都没有“中断”,案例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;
    }
}
对。一种常见的做法是添加如下注释

// fallthrough
表示缺失的
中断是故意的

但是,如果用户拥有DB的版本1,但错过了版本2,并用版本3升级了应用程序,我们该怎么办

onUprade()
将使用
oldVersion
1和
newVersion
3调用。代码应将数据库更新为模式的版本3


使用哪种型号取决于哪种型号最适合您维护。我个人会选择变体A,因为它的代码最少。

使用
开关
而不使用
中断
s是违反直觉的

一种常见的模式是使用一系列
if
s来代替:

if (version_old < 2) {
    database.execSQL(addPostcodeFieldToUserTable);
}
if (version_old < 3) {
    database.execSQL(addGenderFieldToUserTable);
}
if (version_old < 4) {
    database.execSQL(addEmailSubscriptionFieldToUserTable);
}
if(旧版<2){
execSQL(addPostcodeFieldToUserTable);
}
如果(旧版本<3){
execSQL(addGenderFieldToUserTable);
}
如果(旧版本<4){
execSQL(addEmailSubscriptionFieldToUserTable);
}

使用
开关
而不使用
中断
s是违反直觉的

一种常见的模式是使用一系列
if
s来代替:

if (version_old < 2) {
    database.execSQL(addPostcodeFieldToUserTable);
}
if (version_old < 3) {
    database.execSQL(addGenderFieldToUserTable);
}
if (version_old < 4) {
    database.execSQL(addEmailSubscriptionFieldToUserTable);
}
if(旧版<2){
execSQL(addPostcodeFieldToUserTable);
}
如果(旧版本<3){
execSQL(addGenderFieldToUserTable);
}
如果(旧版本<4){
execSQL(addEmailSubscriptionFieldToUserTable);
}

我想说B:如果
一个用户拥有DB的第1版,然后错过了第2版,并用第3版升级了应用程序,那么他/她无论如何都会得到所有的升级。即使是不必要的先前版本(我希望,如果表已经在数据库中,它也会正常地失败)。如果我现在在3个版本中使用onUpgrade方法的版本A,当现有用户下载我使用变体B的应用程序的最新版本时,它会破坏一些东西吗?您还可以详细说明“managed to gracefully fail”thingBy“managed to gracefully fail”我的意思是,每个添加表的方法(即:
addPostcodeFieldToUserTable()
)必须在尝试创建表之前检查表是否存在(或者如果不存在,只需使用
创建表
)。因此,现有表不会被覆盖。并且不会生成错误。因此,在尝试执行ALTER语句之前,请检查表中是否存在列。我会说B:如果
一个用户有DB的版本1,那么错过了版本2,并用版本3升级了应用程序,那么他/她将获得所有升级。即使是不必要的版本ious(我希望,如果表已经在数据库中,它会正常失败)。如果我现在在3个版本中使用onUpgrade方法的版本A,当现有用户下载我使用变体B的应用程序的最新版本时,它会破坏一些东西吗?你能详细说明“管理正常失败”吗“thingBy”“managed to gracefully fail”我的意思是,每个添加表的方法(即:
addPostcodeFieldToUserTable()
)必须在尝试创建表之前检查表是否存在(或者如果不存在,只需使用
创建表
)。因此,现有表不会被覆盖。因此,在尝试执行ALTER语句之前,请检查表中是否存在列。必须执行的语句非常强烈。没有必要。是的,这是可行的,这涉及到个人偏好,即采取什么样的方法。必须做的事情是非常强烈的。没有必要。是的,这可能会奏效,这取决于个人偏好采取什么方法。这是一种解脱,因为我在前三个版本中使用了变体a:)这是一种解脱,因为我在前三个版本中使用了变体a:)