Matthew Weber Matthew Weber - 5 months ago 79
Android Question

What is the correct way to initialize data in a lookup table using DBFlow?

I am trying to implement DBFlow for the first time and I think I might just not get it. I am not an advanced Android developer, but I have created a few apps. In the past, I would just create a "database" object that extends SQLiteOpenHelper, then override the callback methods.

In onCreate, once all of the tables have been created, I would populate any lookup data with a hard-coded SQL string:

db.execSQL(Interface.INSERT_SQL_STRING);
. Because I'm lazy, in
onUpgrade()
and
onDowngrade()
, I would just DROP the tables and call
onCreate(db);
.

I have read through the migrations documentation, which not only seems to be outdated syntactically because "database =" has been changed to "databaseName =" in the annotation, but also makes no mention of migrating from no database to version "initial". I found an issue that claims that migration 0 can be used for this purpose, but I cannot get any migrations to work at this point.

Any help would be greatly appreciated. The project is @ Github.

Answer

The correct way to initialize the database (akin to the SQLiteOpenHelper's onCreate(db) callback is to create a Migration object that extends BaseMigration with the version=0, then add the following to the onCreate() in the Application class (or wherever you are doing the DBFlow initialization):

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

In the Migration Class, you override the migrate() and then you can use the Transaction manager to initialize lookup data or other initial database content.

Migration Class:

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

To populate the data, use your models to create the records and the Transaction Manager to save the models via FlowManager.getDatabase(AppDatabase.class).getTransactionManager() .getSaveQueue().addAll(models);