【问题标题】:Dropping all old tables and recreating tables in dbflow删除所有旧表并在 dbflow 中重新创建表
【发布时间】:2017-06-22 12:54:37
【问题描述】:

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

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

【问题讨论】:

    标签: android sqlite dbflow


    【解决方案1】:

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

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

    【讨论】:

    • 但是在 dbFlow 中有没有更简单的方法来做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多