我一直在Google Developer Advocate上阅读this article关于Room的最佳做法。它提到使用RoomDatabase.Callback()
在数据首次创建时向数据库添加数据。
这一切都很好,但是当Activity
加载时,数据尚未添加。添加数据后,我的数据绑定不会随新数据一起更新。但是,在重新打开应用程序时,它将拥有数据。这是我遇到的一些竞争条件吗?我正在使用Dagger2,它不包含在示例代码中。
@Volatile private var andiDatabase: AndiDatabase? = null
private fun getInstance(): AndiDatabase =
andiDatabase ?: synchronized(this) {
andiDatabase ?: buildDatabase().also { andiDatabase = it }
}
private fun buildDatabase(): AndiDatabase {
return Room.databaseBuilder(application.applicationContext, AndiDatabase::class.java,
"andi-database")
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
ioThread {
getInstance().andiDAO().insert(*databasePopulator.getAndisList())
}
}
})
.fallbackToDestructiveMigration()
.build()
}
@Provides
@Singleton
fun provideAndiDatabase(): AndiDatabase {
return buildDatabase()
}
我的ViewModel
:
val andis: LiveData<List<Andi>> = andiDao.getAllAndis()
val andisList: ObservableArrayList<Andi> = ObservableArrayList()
观察是在Activity
的{{1}}:
onCreate()
在调试时,仅观察到空值。