【问题标题】:What is the correct way to initialize data in a lookup table using DBFlow?使用 DBFlow 在查找表中初始化数据的正确方法是什么?
【发布时间】:2016-03-14 19:08:06
【问题描述】:

我是第一次尝试实现 DBFlow,我想我可能只是不明白。我不是高级 Android 开发人员,但我创建了一些应用程序。过去,我只会创建一个扩展 SQLiteOpenHelper 的“数据库”对象,然后重写回调方法。

在 onCreate 中,一旦创建了所有表,我将使用硬编码的 SQL 字符串填充任何查找数据:db.execSQL(Interface.INSERT_SQL_STRING);。因为我很懒,在onUpgrade()onDowngrade() 中,我只会删除表格并调用onCreate(db);

我已经阅读了迁移文档,它不仅在语法上似乎已经过时,因为注释中的“database =”已更改为“databaseName =”,而且没有提及从无数据库迁移到版本“initial” ”。我发现了一个 issue 声称可以将迁移 0 用于此目的,但目前我无法让任何迁移工作。

任何帮助将不胜感激。该项目是@Github

【问题讨论】:

    标签: android dbflow


    【解决方案1】:

    下面的答案是正确的,但我相信这个答案和问题很快就会与大多数第三方 ORM 一起被“弃用”。大多数情况下会首选 Google 的新 Room Persistence Library (Yigit's Talk)。尽管 DBFlow 肯定会在许多项目中继续使用(谢谢Andrew),但这里是一个很好的地方,可以将人们重新引导到最新的“最佳实践”,因为这个特殊的问题是/适合那些刚接触 DBFlow 的人。

    初始化数据库的正确方法(类似于 SQLiteOpenHelper 的 onCreate(db) 回调是使用 version=0 创建扩展 BaseMigrationMigration object,然后将以下内容添加到 Application 类中的 onCreate() (或您正在执行 DBFlow 初始化的任何地方):

    FlowManager.init(new FlowConfig.Builder(this).build());
    FlowManager.getDatabase(BracketsDatabase.NAME).getWritableDatabase();
    

    在迁移类中,您覆盖migrate(),然后您可以使用事务管理器来初始化查找数据或其他初始数据库内容。

    迁移类:

    @Migration(version = 0, database = BracketsDatabase.class)
    public class DatabaseInit extends BaseMigration {
        private static final String TAG = "classTag";
    
    @Override
    public void migrate(DatabaseWrapper database) {
        Log.d(TAG, "Init Data...");
        populateMethodOne();
        populateMethodTwo();
        populateMethodThree();
        Log.d(TAG, "Data Initialized");
    }
    

    要填充数据,请使用您的模型创建记录并使用事务管理器通过FlowManager.getDatabase(AppDatabase.class).getTransactionManager() .getSaveQueue().addAll(models);保存模型

    【讨论】:

      【解决方案2】:

      要在 DBFlow 中初始化数据,您只需为扩展 BaseModel 的对象模型创建一个类,并为该类使用 @Table 注释。

      然后创建该类的一些对象并在它们上调用.save()

      您可以查看the library's documentation中的示例。

      【讨论】:

      • 我知道几种将数据放入表中的方法,包括创建一个新对象和.save()ing,但我不确定哪种方法是“正确的”,以及何时(或在哪里)去做。我可以将查找数据放在一个数组中,然后循环遍历、创建和保存每条记录,但我认为创建这种类型的框架是为了避免这种类型的骇客。
      • 还有群存:TransactionManager.getInstance().saveOnSaveQueue(yourObjectCollection);
      • 如果你想用初始数据填充你的数据库,你可以在你的迁移类上做到这一点。
      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多