【问题标题】:Android how to know when database has finished creating in MVVMAndroid如何知道数据库何时在MVVM中完成创建
【发布时间】:2020-03-01 20:40:34
【问题描述】:

我在 assets 文件夹中保存了一些 json 数据。我使用此代码读取并将其处理为我创建的数据类:

fun getJsonDataFromAssets(context: Context, fileName: String): String =
    context.assets.open(fileName).bufferedReader().use { it.readText() }

inline fun <reified T> extractJsonData(context: Context, jsonName: String): List<T> {
    val jsonList = JSONArray(getJsonDataFromAssets(context, jsonName))
    val gson = Gson()
    val extractedList = mutableListOf<T>()
    for (i in 0 until jsonList.length()) {
        val jsonObject = jsonList.getJSONObject(i).toString()
        val elementOfT = gson.fromJson(jsonObject, T::class.java)
        extractedList.add(elementOfT)
    }
    return extractedList
}

然后我使用以下代码将这些数据类添加到我的房间数据库回调中:

private class DatabaseCallback(
        private val context: Context,
        private val scope: CoroutineScope
    ) :
        RoomDatabase.Callback() {
        override fun onCreate(db: SupportSQLiteDatabase) {
            super.onCreate(db)
            instance?.let { database ->
                scope.launch {
                    val ownerDao = database.ownerDao()
                    val dogDao = database.dogDao()
                    val catDao = database.catDao()
                    initializeList("owner.json", ownerDao)
                    initializeList("dog.json", dogDao)
                    initializeList("cat.json", catDao)
                }
            }
        }

        suspend inline fun <reified T> initializeList(jsonName:String, dao: IDao<T>) {
            val jsonList = extractJsonData<T>(context, jsonName)
            dao.addAllT(jsonList)
        }
    }

在我的主要活动中,我观察 Livedata 并在应用启动后使用它来填充回收视图。但是,这会使 recyclerview 空白一段时间。

在创建数据库之前如何添加进度条或其他内容?

【问题讨论】:

    标签: android json mvvm android-room


    【解决方案1】:

    一般来说,我会通过使用 Room 对从资产填充数据库的支持来处理这个问题。这是 Room API 中相对较新的新增功能,它应该比您拥有的更快。

    忽略这一点,您需要将一些内容传递给您的 DatabaseCallback 构造函数(例如,一个函数类型),当您的工作完成时可以从您的 onCreate() 函数调用。无论是创建数据库(例如存储库),都将提供 DatabaseCallback 构造函数参数并处理结果。

    因此,例如,您的构造函数可以是:

    private class DatabaseCallback(
        private val context: Context,
        private val scope: CoroutineScope,
        private val onDone: () -> Unit
    )
    

    ...而onCreate() 可以在插入所有条目后调用onDone()。或者,onDone 可能是一个Channel,您在其上offer() 结果。创建 DatabaseCallback 的人将提供 lambda 表达式或 Channel 或其他任何内容,然后使用它来确定工作何时完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多