我必须在第一次运行时预先填充一个 Room 数据库,我看到了 Florina Muntenescu 关于它的要点。
所以,我们有...
@Database(entities = arrayOf(Data::class), version = 1)
abstract class DataDatabase : RoomDatabase() {
abstract fun dataDao(): DataDao
companion object {
@Volatile private var INSTANCE: DataDatabase? = null
fun getInstance(context: Context): DataDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext,
DataDatabase::class.java, "Sample.db")
// prepopulate the database after onCreate was called
.addCallback(object : Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
// insert the data on the IO Thread
ioThread {
getInstance(context).dataDao().insertData(PREPOPULATE_DATA)
}
}
})
.build()
val PREPOPULATE_DATA = listOf(Data("1", "val"), Data("2", "val 2"))
}
但我不明白我应该在哪里调用这个 getInstance 方法,我是否需要在我的片段、MainActivity 或其他地方进行一些虚拟 DAO 调用(只是为了填充 DB)?(假设我打算在这个项目中使用 MVVM)。
或者也许我只是疲倦和盲目地看到解决方案......