Android-Room-在应用程序中初始化
我正在切换到存储数据库逻辑的空间,但我很难找到处理初始化的最佳解决方案 以前,我的应用程序启动到Android-Room-在应用程序中初始化,android,android-room,Android,Android Room,我正在切换到存储数据库逻辑的空间,但我很难找到处理初始化的最佳解决方案 以前,我的应用程序启动到MainActivity,检查数据库是否为空,如果为空,则在设置数据库时打开SplashActivity以显示加载屏幕 对于Room,我正在尝试做类似的事情,或者可能只是删除SplashActivity,并在加载内容时为其创建空视图。虽然我需要知道它是否正在加载,或者只是没有内容 这是我目前尝试的一个解决方案,我有一个默认为true的标志initialized,如果回调点击onCreate,我将其设置
MainActivity
,检查数据库是否为空,如果为空,则在设置数据库时打开SplashActivity
以显示加载屏幕
对于Room,我正在尝试做类似的事情,或者可能只是删除SplashActivity
,并在加载内容时为其创建空视图。虽然我需要知道它是否正在加载,或者只是没有内容
这是我目前尝试的一个解决方案,我有一个默认为true
的标志initialized
,如果回调点击onCreate,我将其设置为false
并初始化数据库。设置完成后,我将其设置为true
,并触发一个事件来通知SplashActivity
abstract class MyRoomDatabase : RoomDatabase() {
fun init() {
val gson = App.application.gson
val content = gson.fromJsonFile(MY_FILE, Content::class.java)
content.let {
contentDao().insertAll(it.values)
}
// load the other content
}
companion object {
@Volatile
private var INSTANCE: MyRoomDatabase? = null
fun getInstance(context: Context): MyRoomDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
fun buildDatabase(context: Context): MyRoomDatabase {
val database = Room.databaseBuilder(context, MyRoomDatabase::class.java, DATABASE_NAME)
.allowMainThreadQueries()
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
Logger.d("Database onCreate!")
getInstance(context).initialized = false
Single.fromCallable {
getInstance(context).init()
Logger.e("Database now initialized -- firing event.")
getInstance(context).initialized = true
App.application.postBusEvent(SetupDatabaseEvent())
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
}
override fun onOpen(db: SupportSQLiteDatabase) {
super.onOpen(db)
Logger.e("Database already initialized.")
}
}).build()
INSTANCE = database
return database
}
}
}
此解决方案存在很多问题,例如存储使用率有时会急剧上升。初始化后,它可能是500KB,然后重新启动应用程序可能会使它跳到6MB。除此之外,我也不认为它很安全
初始化此数据库的更好方法是什么?我想知道它什么时候准备好了,什么时候应该阻止用户
我还需要立即从数据库中获取一个对象
,以设置我的main活动
视图。用户可以选择一个对象
,我将其标记为已选择
,下次他们进入应用程序时,我希望能够将该对象
显示为当前选择
对于Room,我需要在后台获取当前的对象
,这使得我很难立即正确显示它
除了在SharedReferences
中缓存之外,我想知道一种预取方法
如有任何建议,将不胜感激,谢谢 我认为只有当onCreate()启动时,才可以显示启动屏幕或加载进度,从而简化代码,这是第一次创建DB。在其他情况下-立即显示活动。如果您需要加载一些数据,只需显示任务/线程内部的进度,而不要将此逻辑放入RoomDb类中。