Android как узнать, когда база данных закончила создание в MVVM - PullRequest
1 голос
/ 01 марта 2020

У меня есть 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 и использую его для заполнения окна повторного использования, как только приложение запускается. Однако из-за этого в течение некоторого времени окно повторного использования становится пустым.

Как добавить индикатор выполнения или что-то еще, пока база данных не будет создана?

1 Ответ

0 голосов
/ 04 марта 2020

В общем, я бы справился с этим, воспользовавшись поддержкой 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, он предоставил бы лямбда-выражение или Channel или что-то еще, а затем использовал его, чтобы узнать, когда работа будет завершена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...