所以我有一个带有一个表的数据库的应用程序。我想发布一个包含数据库中新表的大更新。
我成功地使用onUpgrade方法通过在onUpgrade方法中执行“db.execSQL(SQL_CREATE_STRING”)在旧数据库中创建新表。
我的问题可能不是很好......但这是一个我无法找到答案的问题。
下次升级数据库会发生什么?在我添加表之前,数据库的版本是2,在新表之后数据库版本是3.如果稍后我想添加另一个表,会发生什么?我是否将当前的“db.execSQL(SQL_CREATE_STRING”)保留在onUpgrade中,还是必须先将其删除?
SQL_CREATE_STRING以“CREATE TABLE IF NOT EXISTS”开头,所以我假设我可以把它留在onUpgrade方法中,对吗?因为如果它已经看到它已经存在,它就不会再尝试制作另一个。
我只想确认这个想法。
谢谢!
答案 0 :(得分:3)
SQL_CREATE_STRING以" CREATE TABLE IF NOT NOT EXISTS"开头,所以我假设我可以把它留在onUpgrade方法中,对吗?因为如果它已经看到它已经存在,它就不会再尝试制作另一个。
听起来不错。但是,当您开始使用更多版本时,可能很难跟踪哪些更新可以运行,无论哪个都没有。
我建议做的是在他们自己的方法中执行每个升级步骤,并按顺序执行给定升级调用所需的所有升级步骤。例如:
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
for(int i = oldVersion + 1; i < newVersion; i++) {
switch(i) {
case 2: upgradeFromv1Tov2(); break;
case 3: upgradeFromv2Tov3(); break;
...
}
}
如果有人正在更新,例如v1到v3,升级将运行v1-> v2,然后运行v2-> v3逻辑。这样做意味着当您创建每个升级步骤时,您确切地知道数据库架构将处于什么状态(即之前的版本),因此您不必担心所有升级步骤之间的交互