我有两个类:TableA
和TableB
,对应于我的应用程序的第一个版本中的SQLite表。
现在我准备发布下一个版本,我必须在其中添加另一个表TableC
。
在每个课程中,我都有onCreate(SQLiteDatabase sqlDatabase)
和onUpgrade(SQLiteDatabase sqlDatabase, int oldVersion, int newVersion)
方法。
以下是我想要做的事情:保持 TableA 原样,
向 TableB 添加新列
当然,创建一个新的 TableC 。
我已在 SQLiteOpenHelper 中更新了我的数据库版本号 我的方法实现如下:
TableA.onUpgrade(/*parameters*/){
//Nothing to do here
}
TableB.onUpgrade(/*parameters*/){
sqlDatabase.execSQL("ALTER TABLE TableB ADD COLUMN columnFoo INTEGER DEFAULT 1");
}
TableC.onUpgrade(/*parameters*/){
sqlDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(sqlDatabase); //calls sqlDatabase.execSQL(CREATE_TableC);
}
我的SQLiteOpenHelper子类实现如下所示:
@Override
public void onCreate(SQLiteDatabase sqlDatabase) {
TableA.onCreate(sqlDatabase);
TableB.onCreate(sqlDatabase);
TableC.onCreate(sqlDatabase);
}
@Override
public void onUpgrade(SQLiteDatabase sqlDatabase, int oldVersion, int newVersion)
{
TableA.onUpgrade(sqlDatabase);
TableB.onUpgrade(sqlDatabase);
TableC.onUpgrade(sqlDatabase);
}
我的问题是我在测试时遇到了麻烦 当我在新的Genymotion Android VM上安装我的应用程序的新版本时,我在 TableB 的启动活动中执行的查询出错,说新列没有存在
我通过在安装了我的应用版本1的现有Genymotion Android VM上进行升级测试 它似乎工作得很好。
我当然可以为每次运行创建新的VM,并安装我的应用程序进行测试 但是我想问一下我可能做错了什么,以及什么是一种好的测试方法 如何正确处理现有用户的数据库更新,以及如何为新用户创建新的数据库/表? 任何帮助表示赞赏!!
我的应用程序支持Android API 14(ICS)及更高版本。
答案 0 :(得分:1)
当设备#1有app db版本时,问题就出现问题2,设备#2有app db版本5,新版本有db版本6。
理想情况下: 设备1应该从2-> 3-> 4-> 5-> 6开始升级。 装置2:5-> 6。
旧的升级代码保持不变,并且您不断为新版本添加新的升级代码。
这是一个例子(处理onUpgrade()的方法之一):
@Override
public void onUpgrade(SQLiteDatabase sqlDatabase, int oldVersion, int newVersion) {
try {
if (oldVersion < 51) {
upgradeToVersion51(db); // From 50 or 51
oldVersion = 51;
}
if (oldVersion == 51) {
upgradeToVersion52(db);
oldVersion += 1;
}
if (oldVersion == 52) {
upgradeToVersion53(db);
oldVersion += 1;
}
} catch (SQLiteException e) {
Log.e(TAG, "onUpgrade: SQLiteException, recreating db. ", e);
Log.e(TAG, "(oldVersion was " + oldVersion + ")");
return; // this was lossy
}
}
注意:你需要碰撞静态最终的int DATABASE_VERSION;无论何时升级,请查看此链接。
检查Calendar如何在此处理数据库升级:http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.1_r1/com/android/providers/calendar/CalendarDatabaseHelper.java/?v=source
希望这有帮助!