Sorguların kullanıcı arayüzünü engellemesini önlemek için Room, ana iş parçacığında veritabanı erişimine izin vermez. Bu kısıtlama, DAO sorgularınızı eşzamansız hale getirmeniz gerektiği anlamına gelir. Room kitaplığı, asenkron sorgu yürütme sağlamak için çeşitli farklı çerçevelerle entegrasyonlar içerir.
DAO sorguları üç kategoriye ayrılır:
- Veritabanına veri ekleyen, güncelleyen veya silen tek seferlik yazma sorguları.
- Veritabanı verilerini yalnızca bir kez okuyan ve o andaki veritabanı anlık görüntüsünü içeren bir sonuç döndüren tek seferlik okuma sorguları.
- Temel veritabanı tabloları her değiştiğinde veritabanınızdan veri okuyan ve bu değişiklikleri yansıtmak için yeni değerler yayan gözlenebilir okuma sorguları.
Dil ve çerçeve seçenekleri
Room, belirli dil özellikleri ve kitaplıklarla birlikte çalışabilirlik için entegrasyon desteği sağlar. Aşağıdaki tabloda, sorgu türüne ve çerçeveye göre geçerli döndürme türleri gösterilmektedir:
Sorgu türü | Kotlin dil özellikleri | RxJava | Guava | Jetpack Lifecycle |
---|---|---|---|---|
Tek seferlik yazma | Koşullu yan rutinler (suspend ) |
Single<T> , Maybe<T> ,
Completable |
ListenableFuture<T> |
Yok |
Tek seferlik okuma | Koşullu yan rutinler (suspend ) |
Single<T> , Maybe<T> |
ListenableFuture<T> |
Yok |
Gözlemlenebilir okuma | Flow<T> |
Flowable<T> , Publisher<T> ,
Observable<T> |
Yok | LiveData<T> |
Bu kılavuzda, DAO'larınızda asenkron sorguları uygulamak için bu entegrasyonları kullanabileceğiniz üç olası yöntem gösterilmektedir.
Flow ve iş akışı ile Kotlin
Kotlin, üçüncü taraf çerçeveleri olmadan asenkron sorgular yazmanıza olanak tanıyan dil özellikleri sunar:
- Room 2.2 ve sonraki sürümlerde, gözlemlenebilir sorgular yazmak için Kotlin'in Flow işlevini kullanabilirsiniz.
- Room 2.1 ve sonraki sürümlerde, Kotlin eşzamanlı olmayan işlemleri kullanarak DAO sorgularınızı eşzamansız hale getirmek için
suspend
anahtar kelimesini kullanabilirsiniz.
RxJava ile Java
Uygulamanız Java programlama dilini kullanıyorsa asenkron DAO yöntemleri yazmak için RxJava çerçevesindeki özel dönüş türlerini kullanabilirsiniz. Room, aşağıdaki RxJava 2 dönüş türlerini destekler:
- Tek seferlik sorgular için Room 2.1 ve sonraki sürümler
Completable
,Single<T>
veMaybe<T>
döndürme türlerini destekler. - Room, gözlemlenebilir sorgular için
Publisher<T>
,Flowable<T>
veObservable<T>
döndürme türlerini destekler.
Ayrıca Room 2.3 ve sonraki sürümler RxJava 3'ü destekler.
LiveData ve Guava ile Java
Uygulamanız Java programlama dilini kullanıyorsa ve RxJava çerçevesini kullanmak istemiyorsanız asenkron sorgu yazmak için aşağıdaki alternatifleri kullanabilirsiniz:
- Asenkron gözlemlenebilir sorgular yazmak için Jetpack'teki
LiveData
sarmalayıcı sınıfını kullanabilirsiniz. - Asenkron tek seferlik sorgular yazmak için Guava'daki
ListenableFuture<T>
sarmalayıcısını kullanabilirsiniz.
Eşzamansız tek seferlik sorgular yazma
Tek seferlik sorgular, yalnızca bir kez çalıştırılan ve yürütülme sırasında verilerin anlık görüntüsünü alan veritabanı işlemleridir. Aşağıda, tek seferlik asenkron sorgulara bazı örnekler verilmiştir:
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); }
Gözlemlenebilir sorgular yazma
Gözlemlenebilir sorgular, sorgu tarafından referans verilen tablolardan herhangi birinde değişiklik olduğunda yeni değerler yayan okuma işlemleridir. Bu özelliği, temel veritabanındaki öğeler eklendikçe, güncellendikçe veya kaldırıldığında görüntülenen öğe listesini güncel tutmak için kullanabilirsiniz. Gözlemlenebilir sorgularla ilgili bazı örnekler:
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); }
Ek kaynaklar
Eşzamansız DAO sorguları hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın: