想用SQLite数据库的onUpgrade方法进行一些澄清

时间:2017-10-19 23:30:28

标签: android sqlite

所以我有一个带有一个表的数据库的应用程序。我想发布一个包含数据库中新表的大更新。

我成功地使用onUpgrade方法通过在onUpgrade方法中执行“db.execSQL(SQL_CREATE_STRING”)在旧数据库中创建新表。

我的问题可能不是很好......但这是一个我无法找到答案的问题。

下次升级数据库会发生什么?在我添加表之前,数据库的版本是2,在新表之后数据库版本是3.如果稍后我想添加另一个表,会发生什么?我是否将当前的“db.execSQL(SQL_CREATE_STRING”)保留在onUpgrade中,还是必须先将其删除?

SQL_CREATE_STRING以“CREATE TABLE IF NOT EXISTS”开头,所以我假设我可以把它留在onUpgrade方法中,对吗?因为如果它已经看到它已经存在,它就不会再尝试制作另一个。

我只想确认这个想法。

谢谢!

1 个答案:

答案 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逻辑。这样做意味着当您创建每个升级步骤时,您确切地知道数据库架构将处于什么状态(即之前的版本),因此您不必担心所有升级步骤之间的交互