Zapisz asynchroniczne zapytania DAO

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:

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:

Próbki

Blogi