假设我在 SQLiteOpenHelper 中有一个包含 2 列的数据库表 test_table 和相应的创建脚本:
DB_VERSION = 1:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B);
}
这是在 Play 商店中发布的初始应用程序版本 1。
一段时间后,应用程序和使用的数据库会更新。我猜 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 将如何表现?--> 处理数据库升级和导入/导出功能的正确方法是什么?