1

dbflow (v4+) の移行スクリプトを書きたいと思っています。以前のテーブルをすべて削除してから、すべてをゼロから構築したいと考えています。現在、これを実行できることがわかった唯一の方法は次のとおりです。

@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());
        }
    }
}

ただし、古いテーブルと新しいテーブルをすべて手動で言及する必要があるため、このアプローチは好きではありません。それを行うより良い方法はありますか?私のデータベースは大幅に変更されたため、すべてのテーブルを削除することが唯一の選択肢のようです。

4

1 に答える 1

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

CREATE 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 メソッドをオーバーライドして、新しい DB バージョンのステートメントを実行できます。例:

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

SQLDBUpgradeUtils では、次のようなものを使用できます。

    public void executeStatement(SQLiteDatabase db, int oldVersion) {
           DataLoaderUtility dataLoaderUtility = new DataLoaderUtility();
           if(oldversion < PresentDBVersion){
            String alterTable = "ALTER TABLE client_data ADD location TEXT"
}
        }
于 2017-06-22T14:51:36.893 に答える