【发布时间】:2019-11-07 20:05:52
【问题描述】:
我尝试在 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: 假
来之前
D/RoomDatabase.Callback: onCreate 调用
在应用程序的运行日志中。
我迷路了。第一次创建时如何将数据导入数据库?
更新:importData 方法使用在第一行创建的AppDatabase 实例。传递给onCreate 的db 参数是底层的低级数据库。自然,我想使用 DAO 和我已经拥有的实体来填充数据库......
【问题讨论】:
-
最好在后台服务中检查一些条件以进行导入。例如
if (dao.count() == 0) importData()之类的东西。这是因为数据的导入可能需要很长时间,所以最好异步进行。
标签: android android-room