Я использую 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()
}
Я хотел бы иметь возможность получить доступ к своему DAO в обратном вызове onCreate()
.Кажется очевидным, что это должно быть возможно, потому что Google объединяет Room и Dagger, и это, вероятно, довольно распространенный вариант использования.
Я пытался предоставить DAO в качестве аргумента конструктора для provideDB()
, но этосоздает циклическую зависимость
Я попытался инициализировать мою RoomDatabase как объект-компаньон.Затем вместо использования формата Room.builder
в моем методе provideDB()
я могу вызвать метод getInstance()
, который имеет доступ к DAO.Но в этом случае я получаю сообщение об ошибке для рекурсивного вызова getWriteableDatabase()
.
. Я понимаю, что могу использовать что-то вроде db.execSQL()
, но мне кажется, что мне стыдно делать это, когда я 'Я использую Комнату.
Есть ли лучший способ, который я пропускаю?Я использую Kotlin, но примеры Java приветствуются.:)