#android #android-room #dao #android-mvvm
#Android #android-room #dao #android-mvvm
Вопрос:
Недавно я учусь использовать DAO. Насколько я понимаю, все @Insert
, @Update
, или @Query
выполняются асинхронно. И из документального @Insert
фильма может возвращать long
значение, которое является новым rowId
для вставленного элемента (или List<long>
, если несколько элементов). Предполагая, что мой DAO выглядит так:
@Insert
long insertTransaction(Transaction transaction);
@Insert
List<Long> insertTransactions(List<Transaction> transactions);
Когда я использую эти методы в activity или fragment, означает ли это, что я получаю длинное значение после завершения асинхронной задачи?
<!-- language: lang-none -->
// Do I get 0 if the insert is not complete
// or it will wait till the insert is complete and return long?
long id = viewModel.insertTransaction(transaction)
Если он ожидает завершения асинхронной задачи, не заблокирует ли он основной поток (особенно при вставке больших списков)? А если нет, как мне проверить, завершена ли вставка?
Ответ №1:
Насколько я понимаю, все @Insert, @Update или @Query выполняются асинхронно.
По умолчанию все @Insert, @Update или @Query выполняются синхронно. Room предупреждает вас об этом, и вы не можете выполнять вызовы синхронизации без явного использования метода allowMainThreadQueries в RoomDatabase.Builder.
Конечно, не рекомендуется использовать синхронные вызовы. Для использования асинхронных вызовов у вас есть несколько вариантов (посмотрите официальную документацию):
- Сопрограммы Kotlin (
suspend
ключевое слово) - RxJava (установите возвращаемый тип в
Single
,Maybe
,Completable
) - Guava (установите возвращаемый тип на
ListenableFuture
).
Кроме того, вы можете явно перемещать операции с БД в фоновый поток с помощью потоков / пулов потоков и самостоятельно управлять асинхронной работой (например, с помощью обратных вызовов).
Используя один из приведенных выше вариантов, вы получите уведомление о завершении асинхронной задачи (метод уведомления зависит от выбранной вами платформы). В противном случае вы выполняете вызов синхронизации и блокируете поток пользовательского интерфейса.
Комментарии:
1. Вы также можете писать асинхронные наблюдаемые запросы, используя LiveData developer.android.com/training/data-storage/room /…