2017-03-09 5 views
0

私のアプリでは、さまざまなリストを作成できます。これらのリストはSQLiteテーブルに格納されます。また、データベースには、将来のアプリのアップデートで変更したいテーブルがあります。私はその場合にユーザーデータの損失を防ぐために何をすべきかわかりません。アプリケーションの更新時にSQLiteデータベースのユーザーデータを処理する方法は?

答えて

3

あなたは、データを損失することなく、新しいバージョンに既存のDBを移行することができ、この関数内の関数

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

があり、新しいテーブルやupdte既存のテーブルに

を追加することができ、ここでのサンプルコードがあります:

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 "); 
    } 
0

アプリの更新によってDBが破損することはありません。

また、単純なSQLマイグレーションでもそれが破損することはありません。

また、将来的にはActiveAndroidのようなORMをご覧ください。

+0

更新でデータベース構造とデータを変更するとどうなりますか? –

+1

_your_表(ユーザー・データが入っている表ではない)の場合、内容を保持する必要はありません。次に、新しい構造体を削除して再作成します。ユーザーデータが入っているもの(または自分のデータを保持する必要がある場合)の場合は、データを_migrate_する必要があります。単純にALTER TABLEを実行することは可能ですが、一般的には既存のテーブルの名前を変更して新しいテーブルを作成し、データを転送/マッサージします。現在のデータがv1、v2、...などであるかどうかを記録する何らかの種類の "DatabaseSchema"設定を追加して、適用する変更を知ることができます。 – TripeHound

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"); 

     } 

ご希望の場合は、こちらをご覧ください。 ハッピーコーディング!

関連する問題