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

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

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

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

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

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

क्वेरी का प्रकार Kotlin लैंग्वेज की सुविधाएं RxJava ग्वावा जेटपैक लाइफ़साइकल
एक बार में लिखने की सुविधा कोरूटीन (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 के फ़्लो की सुविधा मिलती है.
  • Room 2.1 और इसके बाद के वर्शन में, suspend कीवर्ड का इस्तेमाल करके, Kotlin कोरुटिन का इस्तेमाल करके, अपनी DAO क्वेरी को असिंक्रोनस बनाया जा सकता है.

RxJava के साथ Java

अगर आपका ऐप्लिकेशन Java प्रोग्रामिंग भाषा का इस्तेमाल करता है, तो आप खास रिटर्न का इस्तेमाल कर सकते हैं टाइप जो RxJava फ़्रेमवर्क से मिलते-जुलते हैं. Room, 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);
}

अन्य संसाधन

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

सैंपल

ब्लॉग