【发布时间】:2018-11-04 08:38:12
【问题描述】:
我正在使用 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<List<Station>>
}
匕首模块:
@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。很明显这应该是可能的,因为 Google 正在将 Room 和 Dagger 放在一起,这可能是一个非常常见的用例。
我尝试将 DAO 作为 provideDB() 的构造函数参数,但这会产生循环依赖
我尝试将我的 RoomDatabase 初始化为伴随对象。然后,我可以调用可以访问 DAO 的 getInstance() 方法,而不是在我的 provideDB() 方法中使用 Room.builder 格式。但是这样我在递归调用getWriteableDatabase() 时遇到了错误。
我知道我可以使用 db.execSQL() 之类的东西,但是当我使用 Room 时这样做似乎太可惜了。
我错过了更好的方法吗?我正在使用 Kotlin,但欢迎使用 Java 示例。 :)
【问题讨论】:
-
在我看来,使用协程是一个更好的解决方案。一个很好的例子raywenderlich.com/…
标签: android kotlin dagger-2 android-room