Search code examples
androiddbflow

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.


Solution

  • The answer below is correct, but I believe that this Answer and Question will soon be "deprecated" along with most third-part ORMs. Google's new Room Persistence Library (Yigit's Talk) will be preferred in most cases. Although DBFlow will certainly carry on (Thank You Andrew) in many projects, here is a good place to re-direct people to the newest "best practice" because this particular question was/is geared for those new to DBFlow.

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