Um zu verhindern, dass Abfragen die Benutzeroberfläche blockieren, erlaubt Room keinen Datenbankzugriff auf im Hauptthread. Diese Einschränkung bedeutet, dass Sie Ihren DAO asynchron ausführen. Raum enthält Integrationen in verschiedene Frameworks, asynchrone Abfrageausführung.
DAO-Abfragen lassen sich in drei Kategorien unterteilen:
- Einmal schreiben-Abfragen, die Daten in die Datenbank einfügen, aktualisieren oder löschen.
- One-Shot-Leseabfragen, bei denen Daten nur einmal aus Ihrer Datenbank gelesen und diese dann zurückgegeben werden ein Ergebnis mit dem Snapshot der Datenbank zu diesem Zeitpunkt.
- Beobachtbare Leseabfragen, bei denen jedes Mal, wenn der ändern sich die zugrunde liegenden Datenbanktabellen und geben neue Werte aus, um diese Änderungen.
Sprach- und Frameworkoptionen
Der Chatroom bietet Unterstützung für die Interoperabilität mit einer bestimmten Sprache Funktionen und Bibliotheken. Die folgende Tabelle zeigt anwendbare Rückgabetypen basierend auf zum Abfragetyp und zum Framework:
Abfragetyp | Kotlin-Sprachfunktionen | RxJava | Guava | Jetpack-Lebenszyklus |
---|---|---|---|---|
One-Shot-Write | Koroutinen (suspend ) |
Single<T> , Maybe<T> ,
Completable |
ListenableFuture<T> |
– |
Einmaliges Lesen | Koroutinen (suspend ) |
Single<T> , Maybe<T> |
ListenableFuture<T> |
– |
Observable read | Flow<T> |
Flowable<T> , Publisher<T> ,
Observable<T> |
– | LiveData<T> |
In diesem Leitfaden werden drei Möglichkeiten beschrieben, wie Sie diese Integrationen verwenden können, um asynchrone Abfragen in Ihren DAOs zu implementieren.
Kotlin mit Flow und Couroutinen
Kotlin bietet Sprachfunktionen, mit denen Sie asynchrone Abfragen schreiben können. ohne Drittanbieter-Frameworks:
- In Room 2.2 und höher können Sie die Flow-Funktion von Kotlin verwenden, um beobachtbare Abfragen zu schreiben.
- In Raum 2.1 und höher können Sie das Schlüsselwort
suspend
verwenden, um Ihren DAO zu erstellen. Abfragen, die mit Kotlin-Koroutinen asynchron sind
Java mit RxJava
Wenn Sie in Ihrer App die Programmiersprache Java verwenden, können Sie spezielle Rückgabetypen aus dem RxJava-Framework verwenden, um asynchrone DAO-Methoden zu schreiben. Zimmer bieten Unterstützung für die folgenden RxJava 2-Rückgabetypen:
- Für einmalige Abfragen werden in Room 2.1 und höher die Rückgabetypen
Completable
,Single<T>
undMaybe<T>
unterstützt. - Für beobachtbare Abfragen unterstützt Room die
Publisher<T>
,Flowable<T>
, undObservable<T>
-Rückgabetypen.
Außerdem unterstützt Room 2.3 und höher RxJava 3.
Java mit LiveData und Guava
Wenn Ihre App die Programmiersprache Java verwendet und Sie das RxJava-Framework verwenden, können Sie die folgenden Alternativen verwenden, um asynchrone Suchanfragen:
- Sie können den
LiveData
-Wrapper verwenden aus Jetpack, um asynchrone, beobachtbare Abfragen zu schreiben. - Sie können die
ListenableFuture<T>
Wrapper von Guava verwendet, um asynchrone One-Shot-Abfragen zu schreiben.
Asynchrone Einmalabfragen schreiben
One-Shot-Abfragen sind Datenbankvorgänge, die nur einmal ausgeführt werden und einen Snapshot erfassen von Daten zum Zeitpunkt der Ausführung. Hier sind einige Beispiele für asynchrone One-Shot-Abfragen:
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); }
Beobachtbare Abfragen schreiben
Beobachtbare Abfragen sind Lesevorgänge, die immer neue Werte ausgeben, Änderungen an den Tabellen, auf die sich die Abfrage bezieht. Eine Möglichkeit, können Sie die angezeigte Liste der Artikel auf dem neuesten Stand halten. in der zugrunde liegenden Datenbank eingefügt, aktualisiert oder entfernt werden. Hier sind einige Beispiele für beobachtbare Abfragen:
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); }
Weitere Informationen
Weitere Informationen zu asynchronen DAO-Abfragen finden Sie in den folgenden zusätzlichen Ressourcen: