Android:升级数据库版本并添加新表

我已经为我的应用程序创build了sqlite表,但是现在我想向数据库添加一个新表。

我改变了DB版本如下

private static final int DATABASE_VERSION = 2; 

并添加string来创build表

 private static final String DATABASE_CREATE_color = "CREATE TABLE IF NOT EXISTS files(color text, incident_id text)"; 

onCreateonUpgrade如下:

 @Override public void onCreate(SQLiteDatabase database) { database.execSQL(DATABASE_CREATE_incident); database.execSQL(DATABASE_CREATE_audio); database.execSQL(DATABASE_CREATE_video); database.execSQL(DATABASE_CREATE_image); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //drop table and add new tables when version 2 released. db.execSQL(DATABASE_CREATE_color); } 

但由于某种原因,新的表格没有被创build。 我究竟做错了什么?

1.关于onCreate()和onUpgrade()

onCreate(..)被称为每当应用程序是新鲜安装。 只要应用程序升级并启动, 数据库版本不相同,就会调用onUpgrade

2.增加数据库版本

你需要一个像这样的构造函数:

 MyOpenHelper(Context context) { super(context, "dbname", null, 2); // 2 is the database version } 

重要提示:单独增加应用程序版本是不够的onUpgrade被称为!

3.不要忘记你的新用户!

不要忘记添加

 database.execSQL(DATABASE_CREATE_color); 

你的onCreate()方法,或新安装的应用程序将缺乏表。

4.如何处理多个数据库随时间的变化

当你有连续的应用程序升级,其中有几个有数据库升级,你要确保检查oldVersion

 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch(oldVersion) { case 1: db.execSQL(DATABASE_CREATE_color); // we want both updates, so no break statement here... case 2: db.execSQL(DATABASE_CREATE_someothertable); } } 

这样,当用户从版本1升级到版本3时,他们得到两个更新。 当用户从版本2升级到版本3时,他们只是获得版本3更新…毕竟,每次发布更新时都无法指望用户群100%进行升级。 有时他们跳过更新或12 🙂

5.在开发过程中保持修改号码的可控性

最后…打电话

 adb uninstall <yourpackagename> 

完全卸载应用程序。 当你再次安装,你保证打onCreate ,让你不必不断增加数据库版本到平stream层,因为你开发…

你的代码看起来正确。 我的build议是数据库已经认为它已经升级了。 如果您在增加版本号之后执行了项目,但在添加execSQL调用之前,testing设备/模拟器上的数据库可能已经相信它是在版本2。

一个快速的方法来validation这将是更改版本号为3 – 如果它之后升级,你知道这只是因为你的设备相信它已经升级。

你可以使用SQLiteOpenHelper的onUpgrade方法。 在onUpgrade方法中,您将oldVersion作为参数之一。

onUpgrade使用一个switch并在每个case使用版本号来跟踪当前版本的数据库。

最好是从oldVersion循环到newVersion ,一次递增1,然后逐步升级数据库。 当数据库版本1的用户在很长时间后升级应用程序到使用数据库版本7的版本,并且由于某些不兼容的更改导致应用程序开始崩溃时,这非常有用。

然后,数据库中的更新将逐步完成,涵盖所有可能的情况,即将更改合并到每个新版本的数据库中,从而防止应用程序崩溃。

例如:

 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: String sql = "ALTER TABLE " + TABLE_SECRET + " ADD COLUMN " + "name_of_column_to_be_added" + " INTEGER"; db.execSQL(sql); break; case 2: String sql = "SOME_QUERY"; db.execSQL(sql); break; } }