Как работает Android Room DAO @Insert с возвращаемым значением (long или int)?

#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 /…