15

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

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

所以对于第一次下载我更新的应用程序的用户,我认为onUpgrade()不会被调用!android怎么知道什么时候不打电话onUpgrade()

请为我澄清这一点。我想提交我的第一个更新,我不想失去来之不易的用户 :)

4

2 回答 2

23

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

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

假设您的数据库从版本 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 创建的数据库)。

于 2013-01-17T02:12:45.387 回答
4

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

于 2016-06-03T18:04:29.410 回答