2013-01-17 17 views
4

我正在为我当前的应用程序进行更新。我的应用程序使用SQLite数据库,到目前为止我在版本1.我需要改变/介绍我的第二个版本的新表。我做了我的研究,我发现要做到这一点,最好的办法是有switchcase)声明,其中我以逐步方式更新数据库。OnUpgrade何时被调用,它如何获得oldVersion参数?

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

因此,对于第一次下载我的更新应用程序的用户,我假定不会调用onUpgrade()android如何知道何时不要致电onUpgrade()

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

回答

9

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

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

说你的数据库开始的表A中第1版,第2版中,表C在3版本,那么你添加的表B,你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的新创建的数据库)。

+0

完美!感谢您的解释! – Snake

+0

你能提供更详细的解释吗? –

2

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

相关问题