我正在处理当前应用的更新。我的应用程序使用SQLite DB,到目前为止我的版本1.我将需要在第二个版本中更改/引入新表。我做了我的研究,我发现要做到这一点,最好的方法是使用switch
(case
)语句,在其中以直接方式对db进行更新。
我的问题是, Android如何知道onUpgrade()
中的旧版本是什么?。事实上,什么时候被调用?。
因此,对于首次下载我更新的应用的用户,我认为不会调用onUpgrade()
! 知道何时不知道何时不致电onUpgrade()
?
请为我澄清一下。我想提交我的第一个更新,我不想失去我辛苦挣来的用户:)
答案 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()
是一种更好的性能实践。