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类中。