Концептуально, как мне сделать простой цикл чтения / обновления, используя LiveData и Room? - PullRequest
0 голосов
/ 23 октября 2019

В классе репозитория (см .: https://developer.android.com/jetpack/docs/guide), Я пытаюсь:

1) Считать значение из БД комнаты

2) Увеличить значение

3) Запишите значение обратно через appDao в Room.

Я почти уверен, что смогу решить эту проблему на уровне Дао, то есть в транзакции или чем-то еще, но я не уверенесли это правильный подход. Это похоже на довольно простой вариант использования, и решения, которые я придумаю, кажутся намного более сложными, чем необходимо. Я задаюсь вопросом, удерживает ли меня моя слабая ручка на сопрограммах Kotlin здесь.


/* Repository Class*/

fun getCurrentAlarmTime():LiveData<Calendar> {
        return Transformations.map(appDao.getProfileData(currentAlarmTime)){ nullableProfileData ->
           if (nullableProfileData == null) {
               defaultAlarmTime
           } else {
               nullableProfileData.value.toLongOrNull()?.let { millis ->
                   getCalendar(millis)
               }
           }
        }
    }

fun setCurrentAlarmTime(calendar:Calendar) {
        GlobalScope.launch {
            appDao.setProfileData(
                ProfileData(
                    currentAlarmTime,
                    calendar.timeInMillis.toString()
                )
            )
        }
    }

fun incrementAlarmTimeBy1Hour() {
// this is what I'm having a problem with, using the fns above.
// I've got a pretty good handle on LiveData, 
// Transformations, and MediatorLiveData, 
// but I am still stuck.
}

Expected result would be that the time in the database is updated by 1 hour.

1 Ответ

0 голосов
/ 23 октября 2019

Я думаю, что я нашел что-то, что не является ужасным решением, прочитав ссылку на Room здесь: https://developer.android.com/training/data-storage/room/accessing-data

Суть в том, что Room может возвращать LiveData, или она может возвращать то, что явызывать синхронные запросы. Это разница между следующими двумя сигнатурами:

@Query("SELECT * FROM profileData WHERE entry = :entry limit 1")
fun getProfileData(entry: String): LiveData<ProfileData?>

@Query("SELECT * FROM profileData WHERE entry = :entry limit 1")
suspend fun getProfileDataSync(entry: String): ProfileData

Первая, которую вы бы заметили, вторая, которую вы могли бы вызвать напрямую из сопрограммы.

Кто-то должен сообщить мне, если этоне лучшая практика, но кажется, что справочный материал выше подтверждает это.

К сведению, мне не нужно было переводить Room DB в какой-то странный синхронный режим для поддержки этого.

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