Я пытался импортировать данные в методе onCreate:
db = Room.databaseBuilder(applicationContext,
AppDatabase::class.java,
"my-database")
.allowMainThreadQueries()
//.fallbackToDestructiveMigration()
.addCallback(object: RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
Log.d("RoomDatabase.Callback", "onCreate called")
importData()
}
})
.build()
, но это приводит к
IllegalStateException: getDatabase вызывается рекурсивно
Выполнение импорта после создания базы данных также не работает:
var performInitialImport = false
db = Room.databaseBuilder(applicationContext,
AppDatabase::class.java,
"my-database")
.allowMainThreadQueries()
//.fallbackToDestructiveMigration()
.addCallback(object: RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
Log.d("RoomDatabase.Callback", "onCreate called")
performInitialImport = true
}
})
.build()
Log.d("PerformInitialImport", "$performInitialImport")
if (performInitialImport) {
importData()
}
, поскольку обратный вызов не выполняется до продолжения потока управления после построения базы данных. Это видно по тому факту, что
D / PerformInitialImport: false
предшествует
D / RoomDatabase.Callback: onCreate вызывает
в журнале запуска приложения.
Я потерян. Как мне импортировать данные в базу данных при первом создании?
Обновление: В методе importData
используется экземпляр AppDatabase
, созданный в первой строке. Параметр db
, переданный в onCreate
, является базовой базой данных низкого уровня. Естественно, я хочу использовать DAO и сущности, которые у меня уже есть для заполнения базы данных ...