删除所有旧表并在dbflow中重新创建表

时间:2017-06-22 12:54:37

标签: android sqlite dbflow

我想为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());
        }
    }
}

我不喜欢这种方法,因为我们必须手动提及所有旧表和新表。有没有更好的方法来做到这一点。我的数据库发生了重大变化,因此丢弃所有表似乎是唯一的选择。

1 个答案:

答案 0 :(得分:0)

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

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"
}
        }