क्वेरी से यूज़र इंटरफ़ेस (यूआई) को ब्लॉक होने से बचाने के लिए, Room मुख्य थ्रेड पर डेटाबेस को ऐक्सेस करने की अनुमति नहीं देता. इस पाबंदी का मतलब है कि आपको अपनी DAO क्वेरी को असिंक्रोनस बनाना होगा. Room लाइब्रेरी में कई अलग-अलग फ़्रेमवर्क के साथ इंटिग्रेशन शामिल हैं, ताकि एक साथ कई क्वेरी को एक साथ चलाया जा सके.
डीएओ क्वेरी तीन कैटगरी में आती हैं:
- वन-शॉट राइट क्वेरी, जो डेटाबेस में डेटा डालती हैं, अपडेट करती हैं या मिटाती हैं.
- एक बार में डेटा पढ़ने वाली क्वेरी, जो आपके डेटाबेस से सिर्फ़ एक बार डेटा पढ़ती हैं और उस समय डेटाबेस के स्नैपशॉट के साथ नतीजा दिखाती हैं.
- ऑब्ज़र्वेबल रीड क्वेरी, जो आपके डेटाबेस से हर बार डेटा पढ़ती हैं, जब डेटाबेस की टेबल में बदलाव होता है. साथ ही, उन बदलावों को दिखाने के लिए नई वैल्यू भेजती हैं.
भाषा और फ़्रेमवर्क के विकल्प
Room, भाषा से जुड़ी खास सुविधाओं और लाइब्रेरी के साथ काम करने के लिए, इंटिग्रेशन की सुविधा देता है. नीचे दी गई टेबल में, क्वेरी टाइप और फ़्रेमवर्क के आधार पर, लागू होने वाले रिटर्न टाइप दिखाए गए हैं:
क्वेरी का प्रकार | Kotlin लैंग्वेज की सुविधाएं | RxJava | ग्वावा | Jetpack Lifecycle |
---|---|---|---|---|
एक बार में लिखना | कोरूटीन (suspend ) |
Single<T> , Maybe<T> ,
Completable |
ListenableFuture<T> |
लागू नहीं |
एक बार में पढ़ने की सुविधा | कोरूटीन (suspend ) |
Single<T> , Maybe<T> |
ListenableFuture<T> |
लागू नहीं |
Observable read | Flow<T> |
Flowable<T> , Publisher<T> ,
Observable<T> |
लागू नहीं | LiveData<T> |
इस गाइड में, तीन संभावित तरीके बताए गए हैं जिनका इस्तेमाल करके अपने डीएओ में असाइनोक्रोनस क्वेरी लागू की जा सकती हैं.
Flow और कोरूटीन के साथ Kotlin
Kotlin में भाषा से जुड़ी ऐसी सुविधाएं मिलती हैं जिनकी मदद से, तीसरे पक्ष के फ़्रेमवर्क के बिना, असाइनोक्रोनस क्वेरी लिखी जा सकती हैं:
- Room 2.2 और उसके बाद के वर्शन में, ऑब्ज़र्व की जा सकने वाली क्वेरी लिखने के लिए, Kotlin के Flow फ़ंक्शन का इस्तेमाल किया जा सकता है.
- Room 2.1 और इसके बाद के वर्शन में,
suspend
कीवर्ड का इस्तेमाल करके, Kotlin कोरुटिन का इस्तेमाल करके, अपनी DAO क्वेरी को असिंक्रोनस बनाया जा सकता है.
RxJava के साथ Java
अगर आपका ऐप्लिकेशन Java प्रोग्रामिंग भाषा का इस्तेमाल करता है, तो असाइनिटिव DAO तरीके लिखने के लिए, RxJava फ़्रेमवर्क के खास रिटर्न टाइप का इस्तेमाल किया जा सकता है. Room, RxJava 2 के इन रिटर्न टाइप के साथ काम करता है:
- एक बार में पूरी होने वाली क्वेरी के लिए, Room 2.1 और इसके बाद के वर्शन में,
Completable
,Single<T>
, औरMaybe<T>
रिटर्न टाइप काम करते हैं. - निगरानी की जा सकने वाली क्वेरी के लिए, Room में
Publisher<T>
,Flowable<T>
, औरObservable<T>
रिटर्न टाइप काम करते हैं.
इसके अलावा, Room 2.3 और उसके बाद के वर्शन में RxJava 3 काम करता है.
LiveData और Guava के साथ Java
अगर आपका ऐप्लिकेशन Java प्रोग्रामिंग भाषा का इस्तेमाल करता है और आपको RxJava फ़्रेमवर्क का इस्तेमाल नहीं करना है, तो एसिंक्रोनस क्वेरी लिखने के लिए, इन विकल्पों का इस्तेमाल किया जा सकता है:
- असाइनॉन्स (एक साथ कई काम करने की सुविधा) वाली क्वेरी लिखने के लिए, Jetpack की
LiveData
रैपर क्लास का इस्तेमाल किया जा सकता है. - एक बार में पूरी होने वाली असाइनोक्रोनस क्वेरी लिखने के लिए, Guava के
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); }
अन्य संसाधन
एसिंक्रोनस डीएओ क्वेरी के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें: