如何在应用程序更新时处理SQLite数据库中的用户数据?

时间:2017-03-09 11:59:16

标签: android database sqlite

在我的应用中,用户可以创建各种列表。这些列表存储在SQLite表中。此外,数据库中还有其他表,我可能希望在将来的应用更新中进行更改。我不知道在这种情况下我该怎么办才能防止用户数据丢失。

3 个答案:

答案 0 :(得分:3)

有功能

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
    if(oldVersion < newVersion) {
        switch(oldVersion) {
        case 29:
            migrateFrom24(sqLiteDatabase);
            break;
   }
}

在此函数中,您可以将现有数据库迁移到新版本而不会丢失数据

您可以添加新表或更新现有表

这是一个示例代码:

   private static void migrateFrom24(SQLiteDatabase db) {
    db.execSQL("ALTER TABLE Table1 RENAME TO Table2");
    db.execSQL("create table Table3 (_id INTEGER PRIMARY KEY AUTOINCREMENT,created INTEGER ,account_id TEXT DEFAULT \'\',warehouse_id TEXT DEFAULT \'\',skunit_id TEXT DEFAULT \'\',transaction_id TEXT DEFAULT \'\',sku_quantity TEXT DEFAULT \'\',skunits_price TEXT DEFAULT \'\',sku_uploaded TEXT DEFAULT \'0\')");
    db.execSQL("DROP TABLE Table4");
    db.execSQL(" ALTER TABLE Table5 ADD COLUMN column1 INTEGER ");
   }

答案 1 :(得分:2)

当应用程序更新时,您需要增加SQLite数据库版本。一旦你增加你的版本onUpgrade(~)将会调用。

如果您对数据库架构进行了任何更改,则可以删除表并在onCreate(~)中再次调用onUpgrade(~)

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i(TAG, "SQLLiteHelper - onUpgrade");
        Log.w(TAG, "Upgrading application's database from version "+ oldVersion + " to " + newVersion + ", which will destroy all old data");

        /* Drop older table if existed */
        db.execSQL("DROP TABLE IF EXISTS " + "TABLE_NAME");
   }

您的要求是维护特定表的数据,因此需要将数据迁移到临时表,一旦您使用新结构创建表,您可以将所有数据保存回临时表,并且您必须删除临时表收回数据后的表格。

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i(TAG, "SQLLiteHelper - onUpgrade");
        Log.w(TAG, "Upgrading application's database from version "+ oldVersion + " to " + newVersion + ", which will destroy all old data");

        /* Moving Data From Old Database to New Database */
        db.execSQL("CREATE TABLE TEMP_TABLE_NAME AS SELECT * FROM " + "TABLE_NAME");

        /* Deleting Old Table */
        db.execSQL("DROP TABLE IF EXISTS " + "TABLE_NAME");

        /* Creating Same Table with new/updated schema structure*/
        db.execSQL("CREATE TABLE " + "TABLE_NAME" + "(-----TABLE COLUMN DETAILS-----)");

        /* Copy back data from temporary tables */
        db.execSQL("INSERT INTO " + "TABLE_NAME" + " SELECT * FROM TEMP_TABLE_NAME");

        /* Delete temporary table*/
        db.execSQL("DROP TABLE IF EXISTS  TEMP_TABLE_NAME");

        }

希望这有助于满足您的要求。 快乐的编码!!!

答案 2 :(得分:0)

应用更新不会损坏您的数据库。

此外,简单的SQL迁移也不会破坏它。

而且,未来可能会像ActiveAndroid那样看待ORM。