2017-06-22 37 views
0

dbflow(v4 +)用の移行スクリプトを作成したいと思います。前のテーブルをすべて削除してから、すべてをゼロから作成します。現在、私たちはこれを行うことができた唯一の方法は、のようなものです:私たちはすべて手動で古いものと新しいテーブルを言及する必要がありようすべての古いテーブルを削除し、dbflowでテーブルを再作成する

@Migration(version = 2, database = AppDatabase.class) 
public static class Migration2 extends BaseMigration { 

    @Override 
    public void migrate(DatabaseWrapper database) { 

     ArrayList<ModelAdapter> modelAdapters = new ArrayList<>(); 
     // Old tables 
     modelAdapters.add(FlowManager.getModelAdapter(Events.class)); 
     modelAdapters.add(FlowManager.getModelAdapter(Notes.class)); 
     // New table 
     modelAdapters.add(FlowManager.getModelAdapter(User.class)); 

     for (ModelAdapter modelAdapter : modelAdapters) { 
      database.execSQL("DROP TABLE IF EXISTS " + modelAdapter.getTableName()); 
      database.execSQL(modelAdapter.getCreationQuery()); 
     } 
    } 
} 

私はかかわらず、このアプローチが好きではありません。それを行う良い方法はありますか?私のdbは大幅に変更されているので、すべてのテーブルを削除することが唯一の選択肢のようです。

答えて

0

プロパティファイルを使用して、そのファイルにドロップステートメントを書き込むことができます。 次に、以下の関数を使用してファイルを動的にロードし、その中のすべてのステートメントを実行するクラスを作成します。別のファイルを使用して、DB内のすべてのテーブルを動的に作成することもできます。

public void createTable() { 
     try { 
      SQLiteDatabase sqLiteDBConn = SQLLiteDBUtility.getHelper(context).getWritableDatabase(); 
      InputStream inputStream = assetManager 
        .open("deletetable.properties"); 
      Properties properties = new Properties(); 
      properties.load(inputStream); 
      Enumeration<?> propertyKeys = properties.propertyNames(); 
      while (propertyKeys.hasMoreElements()) { 
       String key = (String) propertyKeys.nextElement(); 
       String strDeleteStatement = properties 
         .getProperty(key); 
       sqLiteDBConn.execSQL(strCreateStatement); 
      } 

     } catch (Exception e) { 
      Log.e("Exception", e.getMessage(), e); 
     } 
    } 

TABLEコマンドを作成含有する資産に配置された試料のプロパティファイル:データベースのアップグレード、のために

client_data.create_table = create table if not exists client_data("db_name" TEXT PRIMARY KEY NOT NULL, "db_password" TEXT DEFAULT 'F') 

クラスを作成してからSQLiteOpenHelperにそれを拡張して、ONUPGRADE方法ovverideとのためのステートメントを実行することができますあなたの新しいDBバージョン。例:

はSQLDBUpgradeUtilsで
@Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     SQLDBUpgradeUtils sqlStatementsUtil = new SQLDBUpgradeUtils(); 
     sqlStatementsUtil.executeStatement(db, oldVersion); 
    } 

あなたはこのようなものを使用することができます

public void executeStatement(SQLiteDatabase db, int oldVersion) { 
      DataLoaderUtility dataLoaderUtility = new DataLoaderUtility(); 
      if(oldversion < PresentDBVersion){ 
      String alterTable = "ALTER TABLE client_data ADD location TEXT" 
} 
     } 
+0

をしかしdbFlowでこれを行う簡単な方法はありますか? –

関連する問題