Aby zapobiec blokowaniu interfejsu przez zapytania, sala nie zezwala na dostęp do bazy danych w wątku głównym. To ograniczenie oznacza, że musisz skonfigurować DAO asynchroniczne. Pokój udostępnia integrację z kilkoma różnymi platformami, asynchroniczne wykonywanie zapytań.
Zapytania dotyczące DAO dzielą się na 3 kategorie:
- Zapytania zapisu jednorazowego, które wstawiają, aktualizują lub usuwają dane w bazie danych.
- Zapytania jednorazowe, które odczytują dane z bazy danych tylko raz i zwracają wynik z bieżącym zrzutem dysku bazy danych.
- Dostrzegalne zapytania odczytu, które odczytują dane z bazy danych za każdym razem, gdy bazowe tabele bazy danych zmieniają się i generują nowe wartości, aby je odzwierciedlić zmian.
Opcje języka i platformy
Sala umożliwia integrację w zakresie interoperacyjności w określonym języku funkcje i biblioteki. W tabeli poniżej przedstawiono odpowiednie typy danych zwracanych na podstawie typu zapytania i ramy:
Typ zapytania | Funkcje językowe w Kotlin | RxJava | Gujawa | Cykl życia Jetpack |
---|---|---|---|---|
Zapis jednym uderzeniem | Korutyny (suspend ) |
Single<T> , Maybe<T> ,
Completable |
ListenableFuture<T> |
Nie dotyczy |
Czytanie jednym uderzeniem | Korutyny (suspend ) |
Single<T> , Maybe<T> |
ListenableFuture<T> |
Nie dotyczy |
Obserwowalny odczyt | Flow<T> |
Flowable<T> , Publisher<T> ,
Observable<T> |
Nie dotyczy | LiveData<T> |
Ten przewodnik pokazuje 3 sposoby wykorzystania tych integracji aby wdrożyć asynchroniczne zapytania w DAO.
Kotlin z przepływu i courutyny
Kotlin udostępnia funkcje językowe, które umożliwiają pisanie zapytań asynchronicznych bez korzystania z platform zewnętrznych:
- W pokoju 2.2 lub nowszym możesz korzystać z funkcji Flow do pisania obserwowalnych zapytań.
- W Room 2.1 i nowszych wersjach możesz użyć słowa kluczowego
suspend
, aby zapytania DAO były asynchroniczne, korzystając z korektu Kotlina.
Java z RxJava
Jeśli Twoja aplikacja korzysta z języka programowania Java, możesz użyć specjalnego znaku powrotu ze platformy RxJava do pisania asynchronicznych metod DAO. Wyposażenie pokoju obsługa następujących typów zwracanych RxJava 2:
- W przypadku zapytań jednorazowych pokój 2.1 lub nowszy obsługuje
Completable
Single<T>
, iMaybe<T>
zwracanych typów. - W przypadku zapytań dostrzegalnych funkcja Sala obsługuje
Publisher<T>
Flowable<T>
, iObservable<T>
zwracanych typów.
Dodatkowo Room 2.3 i nowsze wersje obsługują RxJava 3.
Java z LiveData i Guavą
Jeśli Twoja aplikacja korzysta z języka Java i nie chcesz używać modułu środowiska RxJava, możesz użyć następujących alternatywnych rozwiązań do zapisu asynchronicznego zapytania:
- Możesz użyć opakowania
LiveData
z Jetpack do pisania asynchronicznych zapytań dostrzegalnych. - Aby pisać asynchroniczne zapytania jednorazowe, możesz użyć owijarki
ListenableFuture<T>
z Guavy.
Twórz asynchroniczne zapytania jednorazowe
Zapytania jednorazowe to operacje bazy danych, które są wykonywane tylko raz i w momencie wykonania pobierają migawkę danych. Oto kilka przykładów użycia asynchronicznego zapytania jednorazowe:
Kotlin
@Dao interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUsers(vararg users: User) @Update suspend fun updateUsers(vararg users: User) @Delete suspend fun deleteUsers(vararg users: User) @Query("SELECT * FROM user WHERE id = :id") suspend fun loadUserById(id: Int): User @Query("SELECT * from user WHERE region IN (:regions)") suspend fun loadUsersByRegion(regions: List<String>): List<User> }
Java
@Dao public interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) public Completable insertUsers(List<User> users); @Update public Completable updateUsers(List<User> users); @Delete public Completable deleteUsers(List<User> users); @Query("SELECT * FROM user WHERE id = :id") public Single<User> loadUserById(int id); @Query("SELECT * from user WHERE region IN (:regions)") public Single<List<User>> loadUsersByRegion(List<String> regions); }
Java
@Dao public interface UserDao { // Returns the number of users inserted. @Insert(onConflict = OnConflictStrategy.REPLACE) public ListenableFuture<Integer> insertUsers(List<User> users); // Returns the number of users updated. @Update public ListenableFuture<Integer> updateUsers(List<User> users); // Returns the number of users deleted. @Delete public ListenableFuture<Integer> deleteUsers(List<User> users); @Query("SELECT * FROM user WHERE id = :id") public ListenableFuture<User> loadUserById(int id); @Query("SELECT * from user WHERE region IN (:regions)") public ListenableFuture<List<User>> loadUsersByRegion(List<String> regions); }
Tworzenie zapytań do usługi Observeable
Obserwowalne zapytania to operacje odczytu, które emitują nowe wartości, gdy nastąpią zmiany w jakiejkolwiek tabeli, do której odwołuje się zapytanie. Jednym ze sposobów Pomaga to aktualizować wyświetlaną listę elementów, w bazowej bazie danych zostały wstawione, zaktualizowane lub usunięte. Oto kilka przykładów zapytań, które można obserwować:
Kotlin
@Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") fun loadUserById(id: Int): Flow<User> @Query("SELECT * from user WHERE region IN (:regions)") fun loadUsersByRegion(regions: List<String>): Flow<List<User>> }
Java
@Dao public interface UserDao { @Query("SELECT * FROM user WHERE id = :id") public Flowable<User> loadUserById(int id); @Query("SELECT * from user WHERE region IN (:regions)") public Flowable<List<User>> loadUsersByRegion(List<String> regions); }
Java
@Dao public interface UserDao { @Query("SELECT * FROM user WHERE id = :id") public LiveData<User> loadUserById(int id); @Query("SELECT * from user WHERE region IN (:regions)") public LiveData<List<User>> loadUsersByRegion(List<String> regions); }
Dodatkowe materiały
Więcej informacji o asynchronicznych zapytaniach DAO znajdziesz w tych dodatkowych materiałach: