何时调用OnUpgrade以及如何获取oldVersion参数?

时间:2013-01-17 02:01:20

标签: android android-sqlite

我正在处理当前应用的更新。我的应用程序使用SQLite DB,到目前为止我的版本1.我将需要在第二个版本中更改/引入新表。我做了我的研究,我发现要做到这一点,最好的方法是使用switchcase)语句,在其中以直接方式对db进行更新。

我的问题是, Android如何知道onUpgrade()中的旧版本是什么?。事实上,什么时候被调用?

因此,对于首次下载我更新的应用的用户,我认为不会调用onUpgrade()知道何时不知道何时不致电onUpgrade()

请为我澄清一下。我想提交我的第一个更新,我不想失去我辛苦挣来的用户:)

2 个答案:

答案 0 :(得分:14)

实现SQLiteOpenHelper时,将版本参数传递给超类构造函数。这应该是一个静态值,您可以在应用程序的未来版本中进行更改(通常您希望它是SQLiteOpenHelper实现的静态最终属性,以及传递给超类构造函数的数据库名称。 / p>

然后,当您想要更新数据库时,您将增加将在SQLiteOpenHelper实现中使用的版本参数,并在onUpgrade()内以编程方式执行您要执行的SQL修改方法

假设您的数据库在版本1中以表A开头,然后您在版本2中添加了表B,在版本3中添加了表C,您的onUpgrade方法将如下所示:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) { // do stuff for migrating to version 2
        db.execSQL( ...create table B... );
    }
    if (oldVersion < 3) { // do stuff for migrating to version 3
        db.execSQL( ...create table C... );
    }
}

当超类构造函数运行时,它会将存储的SQLite .db文件的版本与作为参数传递的版本进行比较。如果它们不同,则会调用onUpgrade()

我应该检查一下实现,但我认为如果需要创建数据库,onUpgrade()之后也会调用onCreate(),并且有办法确保所有升级都被执行(例如,通过强制所有版本号为正整数并使用版本0初始化新创建的数据库。

答案 1 :(得分:3)

onUpgrade()不是从构造函数中调用的。第一次调用getWritableDatabase()时,将打开数据库onCreate()onUpgrade()和/或onOpen()将被调用。这就是构造函数在主线程上的原因,但是从工作线程调用getWritableDatabase()是一种更好的性能实践。