Я хотел бы удалить таблицу из старых записей, а затем сосчитать записи в ней.
@Transaction
private fun getOrdersCount(): LiveData<Int>
{
val now = LocalDateTime.now()
val firstOfMonth = now.withDayOfMonth(1)
subop_pruning(firstOfMonth) // query that deletes older orders
return subop_select_count() // query that returns the number of orders
}
к сожалению, этот запрос возвращает ошибку
ошибка: метод, аннотированный @Transaction, не должен возвращать отложенный / асин c тип возврата androidx.lifecycle.LiveData. Поскольку транзакции ограничены потоками, и Room не может гарантировать, что все запросы в реализации метода выполняются в одном потоке, разрешены только синхронные методы, реализованные в @Transaction. Если транзакция запущена, а изменение потока выполнено и ожидается, тогда может произойти взаимоблокировка базы данных, если дополнительный поток попытается выполнить запрос. Эти ограничения предотвращают возникновение такой ситуации.
Теперь я хотел бы выполнить последовательность операций -delete- и -select-последовательно и за одну транзакцию и вернуть LiveData из -select счетная операция. Это кажется мне законным. Вопросы:
- Разве запросы внутри транзакции не выполняются последовательно?
- Почему возникает ошибка?
- Как получить такое же поведение, например, с помощью
MutableLiveData
и InvalidationTracker.Observer#onInvalidated
уведомление, если невозможно получить LiveData из транзакций?