Eşzamansız DAO sorgularını yazın

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:

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:

Sana Özel

Bloglar