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)";
onCreate
和onUpgrade
如下:
@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; } }