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. Oda kitaplığı, eşzamansız sorgu yürütmesi için birkaç farklı çerçeveyle entegrasyonlar içerir.
DAO sorguları üç kategoriye ayrılır:
- Veritabanına veri ekleyen, güncelleyen veya silen tek seferlik yazma sorguları.
- Veritabanınızdaki verileri yalnızca bir kez okuyan ve o anda veritabanının anlık görüntüsüyle 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 yayınlayan gözlemlenebilir okuma sorguları.
Dil ve çerçeve seçenekleri
Room, belirli dil özellikleri ve kitaplıklarla birlikte çalışabilirlik için entegrasyon desteği sunar. Aşağıdaki tabloda sorgu türüne ve çerçeveye göre geçerli dönüş türleri gösterilmektedir:
Sorgu türü | Kotlin dilinin özellikleri | RxJava | Guava | Jetpack Yaşam Döngüsü |
---|---|---|---|---|
Tek seferlik yazma | Eş yordamlar (suspend ) |
Single<T> , Maybe<T> ,
Completable |
ListenableFuture<T> |
Yok |
Tek seferlik okuma | Eş yordamlar (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 eşzamansız sorgular uygulamak için bu entegrasyonları kullanabileceğiniz üç olası yol gösterilmektedir.
Flow ve couroutines içeren Kotlin
Kotlin, üçüncü taraf çerçeveler olmadan eşzamansız sorgular yazmanıza olanak tanıyan dil özellikleri sunar:
- Oda 2.2 ve sonraki sürümlerde, gözlemlenebilir sorgular yazmak için Kotlin'in Akış işlevini kullanabilirsiniz.
- Oda 2.1 ve sonraki sürümlerde,
suspend
anahtar kelimesini kullanarak Kotlin eş yordamlarını kullanarak DAO sorgularınızı eşzamansız hale getirebilirsiniz.
RxJava ile Java
Uygulamanız Java programlama dilini kullanıyorsa eşzamansız DAO yöntemleri yazmak için RxJava çerçevesinden özel dönüş türlerini kullanabilirsiniz. Oda, aşağıdaki RxJava 2 iade türleri için destek sağlar:
- Tek seferlik sorgularda Oda 2.1 ve sonraki sürümler
Completable
,Single<T>
veMaybe<T>
döndürme türlerini destekler. - Gözlemlenebilir sorgular için Room,
Publisher<T>
,Flowable<T>
veObservable<T>
döndürme türlerini destekler.
Ayrıca, Oda 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 eşzamansız sorgular yazmak için aşağıdaki alternatifleri kullanabilirsiniz:
- Eşzamansız gözlemlenebilir sorgular yazmak için Jetpack'teki
LiveData
sarmalayıcı sınıfını kullanabilirsiniz. - Eşzamansız tek seferlik sorgular yazmak için Guava'daki
ListenableFuture<T>
sarmalayıcıyı kullanabilirsiniz.
Eşzamansız tek seferlik sorgular yazma
Tek seferlik sorgular, yalnızca bir kez çalıştırılan ve yürütme sırasında verilerin anlık görüntüsünü alan veritabanı işlemleridir. Aşağıda, eşzamansız tek seferlik sorgulara ilişkin 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 başvurulan tablolarda 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ılırken görüntülenen öğeler listesini güncel tutmanıza yardımcı olmak için kullanabilirsiniz. Gözlemlenebilir sorgulara 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 kaynakları inceleyin: