Как работает Room DB с Flow?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как работает Room DB с Flow?

Сообщение Anonymous »

Я экспериментирую с наблюдаемыми объектами Room и Coroutines Flow в простом проекте, но столкнулся с проблемой, при которой поток Flow генерируется несколько раз.
В приложении я извлекаю все данные из фиксированного пользовательского файла. таблицу расходов (например, ежемесячный потоковый сервис, кабельное телевидение и т. д.) и наблюдение за потоком в моей ViewModel. DAO возвращает Flow.
В ViewModel я собираю поток внутри области ViewModel. Внутри блока сбора я проверяю, не истек ли срок платежа. Если это так, я добавляю новый расход в таблицу «Расходы» и обновляю дату последней оплаты фиксированных расходов, чтобы предотвратить повторную оплату тех же расходов при следующей проверке. (С проверкой проблем нет; раньше я проводил модульные тесты, и все работало нормально без сохранения данных в Room).

Код: Выделить всё

private fun observeFixedTransaction() {
viewModelScope.launch {
fixedExpenseRepository.fetchAll()
.distinctUntilChanged()
.collectLatest{
checkDueTransactions(it)
}
}
}
Проблема в том, что когда я добавляю новые фиксированные расходы или начинаю собирать поток, он генерируется несколько раз. Это приводит к тому, что проверка выполняется несколько раз, вызывая состояние гонки, которое добавляет несколько расходов. По какой-то причине семафор внутри блока сбора не работает.
Почему поток генерирует более одного раза, когда я добавляю новую строку или начинаю собирать поток?
Я также пробовал использовать устранение дребезга, но это не сработало.
Я пробовал использовать устранение дребезга, но если я не установил timemilis примерно на 10 секунд, это не сработает. Также пытался использовать семафор с помощью tryacquire, но блок сбора игнорировал семафор (он был инициализирован внутри класса viewModel).

Подробнее здесь: https://stackoverflow.com/questions/787 ... flow-works
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»