2017-10-19 33 views
2

所以我有一个数据库应用程序与一个表。我想推出一个包含数据库中新表的大更新。想用SQLite数据库的onUpgrade方法稍微澄清一下

我成功地运用了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

您可能会发现[不同的方法](https://stackoverflow.com/questions/46339534/android-sqlite-detect-if-new-version-not-found/46342520#46342520)感兴趣。有点冗长,但它使得添加表/列/索引轻而易举,而无需使用'onUpgrade'。适用于我。 – MikeT

回答

3

SQL_CREATE_STRING以“CREATE TABLE IF 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逻辑。这样做意味着在创建每个升级步骤时,您确切知道数据库模式将处于什么状态(即之前的版本),因此您不必担心所有升级步骤之间的交互同时发生。