Я пытаюсь убедиться, что моя база данных всегда содержит начальную строку. Я прочитал Как сначала заполнить таблицу базы данных Android Room run? и главное, с чем я сталкиваюсь, это то, что у меня нет экземпляра для доступа (или я не знаю, как получить к нему доступ?) с помощью Hilt при создании базы данных. Если я попытаюсь повторно использовать написанный мной метод provideDatabase
Hilt, это приведет к утечке базы данных SQLite (предположительно, потому, что рядом нет никого, кто мог бы закрыть базу данных с помощью этих порожденных экземпляров). Вот мой код:
@Module
@InstallIn(ApplicationComponent::class)
object AppModule {
@Singleton
@Provides
fun provideDatabase(@ApplicationContext context: Context): GameDatabase {
return Room.databaseBuilder(context, GameDatabase::class.java, GameDatabase.GAME_DB_NAME)
.addCallback(
object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
// Initialize the database with the first game
ioThread {
provideDatabase(context).gameDao().createNewGame(Game())
}
}
override fun onOpen(db: SupportSQLiteDatabase) {
super.onOpen(db)
// Ensure there is always one game in the database
// This will capture the case of the app storage
// being cleared
// THIS results in an instance being created that can't be closed - causing DB leaks!
ioThread {
val gameDao = provideDatabase(context).gameDao()
if (gameDao.gameCount() == 0) {
gameDao.createNewGame(Game())
}
}
}
}
).build()
}
@Singleton
@Provides
fun provideGameDao(database: GameDatabase): GameDao {
return database.gameDao()
}
}
Итак, как мне получить доступ к ДАО для инициализации? Нужно ли мне просто вручную создавать оператор вставки в SQL и вызывать его в базе данных?