Это DatabaseModule:
Код: Выделить всё
@Module
@InstallIn(ApplicationComponent::class)
object DatabaseModule {
@Singleton
@Provides
fun provideDatabase(
@ApplicationContext context: Context
): PersonDatabase {
return Room.databaseBuilder(
context,
PersonDatabase::class.java,
"person_database"
).build()
}
@Singleton
@Provides
fun provideDao(database: PersonDatabase) = database.personDao()
}
Код: Выделить всё
class PersonCallback @Inject constructor(
private val dao: PersonDao
) : RoomDatabase.Callback() {
private val applicationScope = CoroutineScope(SupervisorJob())
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
applicationScope.launch(Dispatchers.IO) {
populateDatabase()
}
}
private suspend fun populateDatabase() {
val person = Person("FirstName", "LastName", 20)
dao.insertData(person)
}
}
Код: Выделить всё
@Singleton
@Provides
fun provideDatabase(
@ApplicationContext context: Context
): PersonDatabase {
return Room.databaseBuilder(
context,
PersonDatabase::class.java,
"person_database"
).addCallback(
PersonCallback(provideDatabase(context).personDao())
).build()
}
Предварительное заполнение базы данных Room с Hilt без создания дополнительного экземпляра базы данных
После вышеизложенного приложение снова аварийно завершилось, выдав огромную ошибку, которая ссылалась на автоматически сгенерированный класс и ничего не дала очень важно, чтобы сделать его более значимым.
Другой метод, который я пробовал, заключался в передаче dao в качестве параметра, но он снова вылетел с ошибкой, сообщающей, что это приводит к циклу зависимости, поскольку у меня также есть передал дао в репозиторий как параметр конструктора.
Код: Выделить всё
@Singleton
@Provides
fun provideDatabase(
@ApplicationContext context: Context,
personDao: PersonDao
): PersonDatabase {
return Room.databaseBuilder(
context,
PersonDatabase::class.java,
"person_database"
).addCallback(
PersonCallback(personDao)
).build()
}
Подробнее здесь: https://stackoverflow.com/questions/690 ... -with-hilt