假设我有一个包含 2 列的数据库表 test_table 以及 SQLiteOpenHelper 中相应的创建脚本:
DB_VERSION = 1:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B);
}
这是最初的应用程序版本 1,已在 Play 商店中发布。
一段时间后,应用程序和所使用的数据库就会更新。
我想 SQLiteOpenHelper 类必须像这样进行调整:
DB_VERSION = 2:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C)");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}
一段时间后,另一个应用程序更新:
DB_VERSION = 3:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C, COL_D)");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}
--> 这就是我需要建议的地方。
如果用户安装应用程序版本 1,则他有 A 列和 B 列。
如果他随后更新到版本 2,则会触发 onUpgrade 并添加列 C。
从头开始安装的新用户通过 create 语句获取 3 列。
如果用户随后更新到版本 3,则会再次触发 onUpgrade 并添加 D 列。
但是,如果用户安装应用程序版本 1,然后跳过版本 2 的更新并更新版本 3,该怎么办?那么他就错过了
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}
部分且仅
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}
会被调用,这会导致表 test_table(COL_A, COL_B, COL_D)??
处理实时应用程序的数据库升级的正确方法是什么,这样用户就不会丢失数据?
您是否必须在 onUpgrade() 方法中检查所有可能的(旧)版本并根据该版本执行不同的 alter table 语句?
我这样问是因为在我的应用程序中,用户可以导出和导入数据,这无非是导出:复制整个数据库和导入:用备份副本数据库替换应用程序数据库。
如果用户拥有应用程序版本 1、导出数据库、升级应用程序(新数据库结构)并导入旧版本 1 备份,会发生什么情况?
--> SQLiteOpenHelper 将如何表现?
--> 处理数据库升级以及导入/导出功能的正确方法是什么?