作者:_Cokoice | 来源:互联网 | 2022-12-16 10:45
我正在使用Dagger 2在我的应用程序中创建和共享我的RoomDatabase.
我正在尝试实现addCallback(),因此我可以覆盖数据库的onCreate函数并使用它来插入我的初始数据库值.这是我遇到问题的地方.
我觉得我必须忽略一些显而易见的事情,但我无法找到一种方法来优雅地做到这一点.
RoomDatabase类:
@Database(
entities = [Station::class],
version = 1,
exportSchema = false
)
abstract class TrainDB : RoomDatabase() {
abstract fun stationDao() : StationDao
}
DAO:
@Dao
abstract class StationDao {
@Insert(OnConflict= OnConflictStrategy.REPLACE)
abstract fun insert(stations: Station)
@Query("SELECT * FROM station_table")
abstract fun getAll() : LiveData>
}
匕首模块:
@Module
class DataModule {
@Singleton
@Provides
fun provideDb(app: Application): TrainDB {
var trainDB: TrainDB? = null
trainDB = Room
.databaseBuilder(app, TrainDB::class.java, "train.db")
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
/*
WHAT GOES HERE?
*/
}
})
.build()
return trainDB
}
@Singleton
@Provides
fun providesStationDao(db: TrainDB) : StatiOnDao= db.stationDao()
}
我希望能够在onCreate回调中访问我的DAO.很明显这应该是可能的,因为谷歌正在将Room和Dagger推到一起,这可能是一个非常常见的用例.
我已经尝试将DAO作为provideDB的构造函数参数提供,但这会创建循环依赖
我尝试将RoomDatabase初始化为伴侣对象.然后我可以调用一个可以访问DAO的getInstance方法,而不是在我的provideDB方法中使用Room.builder格式.但是这样我遇到了对getWriteableDatabase的递归调用的错误.
我知道我可以使用像db.execSQL这样的东西,但是当我使用Room时,这样做真是太可惜了.
有没有更好的方法让我失踪?我正在使用Kotlin,但欢迎使用Java示例.:)