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

Sna*_*ake 11 android android-sqlite

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

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

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

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

Mar*_*eón 19

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

然后,当您想要更新数据库时,您将增加将在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... );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我应该检查实现,但我假设onUpgrade()onCreate()需要创建数据库之后也会调用,并且有一种方法可以确保执行所有升级(例如,通过强制所有版本号为正整数并初始化初始化用版本0创建数据库).


小智 5

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