एसिंक्रोनस डीएओ क्वेरी लिखें

क्वेरी को यूज़र इंटरफ़ेस (यूआई) ब्लॉक करने से रोकने के लिए, रूम ने डेटाबेस को ऐक्सेस करने की अनुमति नहीं दी है मुख्य थ्रेड. इस पाबंदी का मतलब है कि आपको डीएओ क्वेरी एसिंक्रोनस न हों. द रूम लाइब्रेरी में कई अलग-अलग फ़्रेमवर्क के साथ इंटिग्रेशन मौजूद होते हैं. एसिंक्रोनस क्वेरी निष्पादन.

डीएओ क्वेरी तीन कैटगरी में आती हैं:

  • वन-शॉट राइट वाली ऐसी क्वेरी जो डेटाबेस में डेटा जोड़ती हैं, अपडेट करती हैं या मिटाती हैं.
  • वन-शॉट रीड ऐसी क्वेरी जो आपके डेटाबेस से डेटा को सिर्फ़ एक बार पढ़ती हैं और नतीजे दिखाती हैं उस समय डेटाबेस के स्नैपशॉट के साथ एक नतीजा मिलेगा.
  • देखी जा सकने वाली क्वेरी, जो हर बार आपके डेटाबेस से डेटा को पढ़ती हैं: मौजूदा डेटाबेस टेबल उन्हें दिखाने के लिए नई वैल्यू बनाती हैं और उनमें बदलाव करती हैं बदलाव.

भाषा और फ़्रेमवर्क के विकल्प

रूम, किसी खास भाषा के साथ इंटरऑपरेबिलिटी (दूसरे सिस्टम के साथ काम करना) के लिए, इंटिग्रेशन की सुविधा देता है सुविधाओं और लाइब्रेरी पर लागू होता है. इस टेबल में, सामान लौटाने के अलग-अलग तरीकों के बारे में बताया गया है ये क्वेरी टाइप और फ़्रेमवर्क के हिसाब से होते हैं:

क्वेरी का प्रकार Kotlin लैंग्वेज की सुविधाएं आरएक्सजावा ग्वावा जेटपैक लाइफ़साइकल
एक बार में लिखने की सुविधा कोरूटीन (suspend) Single<T>, Maybe<T>, Completable ListenableFuture<T> लागू नहीं
एक बार में रीड ओनली कोरूटीन (suspend) Single<T>, Maybe<T> ListenableFuture<T> लागू नहीं
आसानी से पढ़ा जा सकने वाला टेक्स्ट Flow<T> Flowable<T>, Publisher<T>, Observable<T> लागू नहीं LiveData<T>

इस गाइड में, इंटिग्रेशन का इस्तेमाल करने के तीन संभावित तरीकों के बारे में बताया गया है का इस्तेमाल करें.

फ़्लो और कोर्स के साथ Kotlin

Kotlin में भाषा से जुड़ी सुविधाएं मिलती हैं, जिनसे आपको एसिंक्रोनस क्वेरी लिखने में मदद मिलती है ये टूल तीसरे पक्ष के फ़्रेमवर्क के बिना:

  • रूम 2.2 और उसके बाद के वर्शन में, Kotlin के फ़्लो की सुविधा मिलती है.
  • रूम 2.1 और उसके बाद के वर्शन में, suspend कीवर्ड का इस्तेमाल करके डीएओ बनाया जा सकता है Kotlin कोरूटीन का इस्तेमाल करके, एसिंक्रोनस क्वेरी इस्तेमाल की जा सकती हैं.

RxJava वाला Java

अगर आपका ऐप्लिकेशन Java प्रोग्रामिंग भाषा का इस्तेमाल करता है, तो आप खास रिटर्न का इस्तेमाल कर सकते हैं टाइप किया गया है. ये टाइप, RxJava फ़्रेमवर्क से मिले हैं. कमरे की सुविधाएं नीचे दिए गए RxJava 2 रिटर्न टाइप के लिए भी सहायता मिलती है:

  • एक-बार में की जाने वाली क्वेरी के लिए, रूम 2.1 और उससे ऊपर के वर्शन, Completable Single<T>, और Maybe<T> रिटर्न टाइप.
  • रूम, मॉनिटर की जा सकने वाली क्वेरी के लिए, Publisher<T> Flowable<T>, और Observable<T> रिटर्न टाइप.

इसके अलावा, रूम 2.3 और उससे आगे के वर्शन RxJava 3 पर भी काम करते हैं.

LiveData और Guava के साथ Java

अगर आपका ऐप्लिकेशन Java प्रोग्रामिंग भाषा का इस्तेमाल करता है और आपको RxJava फ़्रेमवर्क के तौर पर, तो एसिंक्रोनस लिखने के लिए नीचे दिए गए विकल्प इस्तेमाल किए जा सकते हैं क्वेरी:

  • LiveData रैपर का इस्तेमाल किया जा सकता है क्लास का इस्तेमाल करें.
  • Google आपके यूआरएल पैरामीटर को कैसे इस्तेमाल करेगा, यह तय करने के लिए ListenableFuture<T> रैपर का इस्तेमाल करें.

एसिंक्रोनस वन-शॉट क्वेरी लिखें

वन-शॉट क्वेरी, ऐसी डेटाबेस ऑपरेशन होती हैं जो सिर्फ़ एक बार चलती हैं और स्नैपशॉट लेती हैं डेटा को कॉपी करते हैं. यहां एसिंक्रोनस के कुछ उदाहरण दिए गए हैं एक बार में ली जाने वाली क्वेरी:

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);
}

मॉनिटर की जा सकने वाली क्वेरी लिखें

ऑब्ज़र्व की जा सकने वाली क्वेरी रीड ऑपरेशन होती हैं, जो क्वेरी से रेफ़र की गई किसी भी टेबल में बदलाव करता है. इसका मतलब यह है कि इसका इस्तेमाल, आइटम की दिखाई गई सूची को आइटम के तौर पर अप-टू-डेट रखने के लिए किया जाता है को डाला जाता है, अपडेट किया जाता है या हटाया जाता है. यहां कुछ मॉनिटर की जा सकने वाली क्वेरी के उदाहरण:

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);
}

अन्य संसाधन

एसिंक्रोनस डीएओ क्वेरी के बारे में ज़्यादा जानने के लिए, यहां दी गई अतिरिक्त जानकारी देखें संसाधन:

सैंपल

ब्लॉग