Matthew Weber Matthew Weber - 4 months ago 45x
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:

. Because I'm lazy, in
, I would just DROP the tables and call

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.


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

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

public void migrate(DatabaseWrapper database) {
    Log.d(TAG, "Init Data...");
    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);