SQLite升级问题

时间:2014-02-01 05:15:55

标签: android sqlite upgrade

我有两个类:TableATableB,对应于我的应用程序的第一个版本中的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)及更高版本。

1 个答案:

答案 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

希望这有帮助!