Chr*_*man 8 android kotlin dagger-2 android-room
我正在使用Dagger 2在我的应用程序中创建和共享我的RoomDatabase.
我正在尝试实现addCallback(),因此我可以覆盖数据库的onCreate函数并使用它来插入我的初始数据库值.这是我遇到问题的地方.
我觉得我必须忽略一些显而易见的事情,但我无法找到一种方法来优雅地做到这一点.
RoomDatabase类:
@Database(
entities = [Station::class],
version = 1,
exportSchema = false
)
abstract class TrainDB : RoomDatabase() {
abstract fun stationDao() : StationDao
}
Run Code Online (Sandbox Code Playgroud)
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>>
}
Run Code Online (Sandbox Code Playgroud)
匕首模块:
@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()
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在onCreate回调中访问我的DAO.很明显这应该是可能的,因为谷歌正在将Room和Dagger推到一起,这可能是一个非常常见的用例.
我已经尝试将DAO作为provideDB的构造函数参数提供,但这会创建循环依赖
我尝试将RoomDatabase初始化为伴侣对象.然后我可以调用一个可以访问DAO的getInstance方法,而不是在我的provideDB方法中使用Room.builder格式.但是这样我遇到了对getWriteableDatabase的递归调用的错误.
我知道我可以使用像db.execSQL这样的东西,但是当我使用Room时,这样做真是太可惜了.
有没有更好的方法让我失踪?我正在使用Kotlin,但欢迎使用Java示例.:)
我是这样管理的:
@Module
class DataModule {
lateinit var trainDB: TrainDB
@Singleton
@Provides
fun provideDb(app: Application): TrainDB {
trainDB = Room
.databaseBuilder(app, TrainDB::class.java, "train.db")
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
/*
trainDB.stationDao().insert(...)
*/
}
})
.build()
return trainDB
}
@Singleton
@Provides
fun providesStationDao(db: TrainDB) : StationDao = db.stationDao()
}
Run Code Online (Sandbox Code Playgroud)
但请记住,您需要从数据库进行假读取才能启动数据库并调用 onCreate()。当数据库尚未创建时,不要在第一次交互时写入数据库,因为这会创建竞争条件,并且您的创建写入不会生效。
你可以在java中做到这一点
AppDatabase appDatabase = null;
AppDatabase finalAppDatabase = appDatabase;
appDatabase = Room.databaseBuilder(MyApplication.getApplication(),
AppDatabase.class, Constants.DATABASE_NAME).
addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
//check for null
finalAppDatabase.yourDao();
}
}).
build();
return appDatabase;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2391 次 |
| 最近记录: |