Предварительное заполнение базы данных комнат с помощью HiltAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Предварительное заполнение базы данных комнат с помощью Hilt

Сообщение Anonymous »

Я пытаюсь предварительно заполнить базу данных Room данными с помощью метода RoomDatabase.Callback() и тоже добился успеха. Позже я попытался работать так же с Hilt, но не смог понять, как добавить обратный вызов при предоставлении базы данных в модуле hilt.
Это 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()

}
Затем я последовал сообщению SO и попытался воспроизвести его, а именно:

Предварительное заполнение базы данных 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()

}
После всех этих попыток я не могу понять, как мне передать dao в класс обратного вызова и заставить его работать. Я прошу предложить некоторые способы сделать это, или любые альтернативы также будут оценены по достоинству.

Подробнее здесь: https://stackoverflow.com/questions/690 ... -with-hilt
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»