在Android中升级SQLite数据库

时间:2014-04-07 06:08:57

标签: android sqlite

我正在制作一个Android应用程序,我正在使用SQLite数据库。我已经发布了它的一个版本,现在已经发布了第二个和第三个版本,假设我需要更改数据库表,如添加/删除字段。

那么如何在Android中处理此升级。在这里,我不想删除整个表格,这里应该使用Alter来更新表格。

假设用户已经安装了我的应用程序的第一个版本,那么几天之后我发布了下一个版本1.1并对数据库表进行了更改 - 添加了一个字段,此处用户没有升级它,同时我再次发布了{{ 1}}再添加一个字段

所以这里我将如何处理这种情况当这个用户将我的应用程序从版本1.2升级到版本1时,错过版本1.2并且我添加的属性也错过了会造成问题。

解决这个问题的任何解决方案??

3 个答案:

答案 0 :(得分:3)

假设您正在使用SQLiteOpenHelper,只需为数据库架构更改的任何待发布版本增加数据库版本号。如果有一个较旧的数据库文件,将调用onUpgrade(),以便您可以从任何旧版本迁移数据库。

例如,如果1.0数据库版本为1,则1.1为2,1.2为3,用户将版本1.0更新为1.2。调用onUpgrade()时,oldVersion设置为1,newVersion设置为3.从这些版本号中,您的代码可以找出需要完成的操作,例如:

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    switch (oldVersion) {
        case 1:
        updateFrom1To2(db);

        case 2: // fall-through
        updateFrom2To3(db);

        break;

        default:
        Assert.fail("You forgot to write code for oldVersion " + oldVersion);
    }
}

答案 1 :(得分:0)

您可以在sqldb中的onUpgrade中执行任何操作 。您可以使用ALTER向表中添加新列。

最糟糕的情况是,如果您的架构完全不同,您必须创建新表,使用旧表中的数据填充它,然后删除旧表。

无论如何,onUpgrade旨在实现平滑升级而不会丢失任何数据。您可以正确地实施它。 您应该在onUpgrade方法中放置所有更改,您可以使用此代码:

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    String sql = "ALTER TABLE " + TABLE_SECRET + " ADD COLUMN " +
     "name_of_column_to_be_added" + " INTEGER";
    db.execSQL(sql);        
}   

了解更多this

修改

  

这是一个很好的想法,我找到了一个解决方案(未经测试),你需要   检查更新,示例 - 检查您在1.1中完成的ALTER   版本1.2通过读取db行或某些东西,如果它   不存在,你想用1.2改变来改变它。

答案 2 :(得分:0)

我通常遵循onUpgrade方法的不同类型的实现来支持数据库中的向后兼容性。

注意:这里我只展示在最新数据库版本中添加更多列的实现。

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //  1.  Copy the database file to temproary file.
    //  2.  Drop all the old tables from db
    //            db.execSQL("DROP TABLE IF EXISTS " + <TABLE NAME> );
    //  3.  Create tables using new Schema
    //            this.onCreate(db);
    //  4. Copy the data from temproary file to new db
    //  5. Remove the temprorary file
}

使用这种实现比使用ALTER命令更方便。