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

您可以使用属性文件并在该文件中编写您的删除语句。然后,创建一个使用以下函数的类来动态加载文件并执行其中的所有语句。您还可以使用另一个文件在数据库中动态创建所有表。

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

放置在包含创建表命令的资产中的示例属性文件:

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 方法并执行新数据库版本的语句。例子:

@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 回答