It's took me a while to understand why a Room database is not populated with initial data after invoking .build()
on a database builder.
As for me, it's really counter-intuitive that migrations and callbacks are triggered only on real read/write operation. Actually the issue caused by the reason that Room use class RoomOpenHelper
which, as mentioned in documentation:
An open helper that holds a reference to the configuration until the database is opened.
As the result, configuration and all callbacks stored in the instance of RoomOpenHelper
class while Sqlite's SQLiteOpenHelper
, which actually performs database migrations, not created (lazy class loading in Java).
To overcome this behavior, any operation which cause getWritableDatabase()
should be performed. I ended up with the following approach:
RoomDatabase db = Room.databaseBuilder(context,
...)
.build();
// and then
db.beginTransaction()
db.endTransaction()
// or query a dummy select statement
db.query("select 1", null)
return db
After that the database will be created and populated with initial data.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…