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. 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:

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:

Bloglar