Room का इस्तेमाल करके, डेटा को किसी स्थानीय डेटाबेस में सेव करना Android Jetpack का हिस्सा.
ऐसे ऐप्लिकेशन जो स्ट्रक्चर्ड डेटा की बड़ी मात्रा को मैनेज करते हैं उन्हें डेटा को स्थानीय तौर पर सेव करने से काफ़ी फ़ायदा मिल सकता है. इसका सबसे आम इस्तेमाल, काम के डेटा को कैश मेमोरी में सेव करना है. इससे जब डिवाइस नेटवर्क को ऐक्सेस नहीं कर पाता है, तब भी उपयोगकर्ता उस कॉन्टेंट को ब्राउज़ कर सकते हैं.
Room परसिस्टेंस लाइब्रेरी, SQLite को लेकर एक ऐब्स्ट्रैक्शन लेयर उपलब्ध कराती है, ताकि डेटाबेस को ज़्यादा अच्छे से ऐक्सेस किया जा सके. खास तौर पर, Room से ये फ़ायदे मिलते हैं:
- एसक्यूएल क्वेरी के कंपाइल होने में लगने वाले समय की पुष्टि.
- सुविधा देने वाले एनोटेशन, जो बार-बार इस्तेमाल किए जाने वाले और गड़बड़ी होने की आशंका वाले बॉयलरप्लेट कोड को कम करते हैं.
- डेटाबेस माइग्रेशन के बेहतर पाथ.
हमारा सुझाव है कि SQLite API का सीधे तौर पर इस्तेमाल करने के बजाय, Room का इस्तेमाल करें.
सेटअप
अपने ऐप्लिकेशन में Room का इस्तेमाल करने के लिए, अपने मॉड्यूल की build.gradle.kts फ़ाइल में ये डिपेंडेंसी जोड़ें. Room 3.0 को एनोटेशन प्रोसेसिंग के लिए KSP की ज़रूरत होती है.
Kotlin
dependencies { val room_version = "3.0.1" implementation("androidx.room3:room3-runtime:$room_version") ksp("androidx.room3:room3-compiler:$room_version") }
Groovy
dependencies { def room_version = "3.0.1" implementation "androidx.room3:room3-runtime:$room_version" ksp "androidx.room3:room3-compiler:$room_version" }
मुख्य कॉम्पोनेंट
रूम में तीन बड़े कॉम्पोनेंट हैं:
- डेटाबेस क्लास, जिसमें डेटाबेस होता है. साथ ही, यह ऐप्लिकेशन के बरकरार रखे गए डेटा तक जाने के लिए, मूल कनेक्शन का मुख्य ऐक्सेस पॉइंट होता है.
- डेटा एंटिटी, आपके ऐप्लिकेशन के डेटाबेस में मौजूद टेबल को दिखाती हैं.
- डेटा ऐक्सेस ऑब्जेक्ट (डीएओ), ऐसे फ़ंक्शन उपलब्ध कराते हैं जिनका इस्तेमाल करके आपका ऐप्लिकेशन, डेटाबेस में मौजूद डेटा को क्वेरी कर सकता है, अपडेट कर सकता है, इंसर्ट कर सकता है, और मिटा सकता है.
डेटाबेस क्लास, आपके ऐप्लिकेशन को उस डेटाबेस से जुड़े डीएओ के इंस्टेंस उपलब्ध कराती है. इसके बाद, ऐप्लिकेशन डीएओ का इस्तेमाल करके, डेटाबेस से डेटा को उससे जुड़ी डेटा इकाई के ऑब्जेक्ट के इंस्टेंस के तौर पर वापस पा सकता है. ऐप्लिकेशन, तय की गई डेटा इकाइयों का इस्तेमाल करके, उनसे जुड़ी टेबल की पंक्तियों को अपडेट कर सकता है. इसके अलावा, नई पंक्तियां जोड़ने के लिए भी इनका इस्तेमाल किया जा सकता है. पहली इमेज में, Room के अलग-अलग कॉम्पोनेंट के बीच का संबंध दिखाया गया है.
लागू करने का उदाहरण
इस सेक्शन में, एक डेटा इकाई और एक डीएओ के साथ Room डेटाबेस को लागू करने का उदाहरण दिया गया है.
डेटा इकाई
नीचे दिए गए कोड में, User डेटा इकाई के बारे में बताया गया है. User का हर इंस्टेंस, ऐप्लिकेशन के डेटाबेस में मौजूद user टेबल की एक लाइन को दिखाता है.
@Entity data class User( @PrimaryKey val uid: Int, @ColumnInfo(name = "first_name") val firstName: String, @ColumnInfo(name = "last_name") val lastName: String )
Room में डेटा एंटिटी के बारे में ज़्यादा जानने के लिए, Room एंटिटी का इस्तेमाल करके डेटा के बारे में बताना लेख पढ़ें.
डेटा ऐक्सेस ऑब्जेक्ट (डीएओ)
नीचे दिए गए कोड में, UserDao नाम के DAO को परिभाषित किया गया है. UserDao ऐसे फ़ंक्शन उपलब्ध कराता है जिनका इस्तेमाल ऐप्लिकेशन के बाकी हिस्से, user टेबल में मौजूद डेटा के साथ इंटरैक्ट करने के लिए करते हैं.
@Dao interface UserDao { @Query("SELECT * FROM user") suspend fun getAll(): List<User> @Query("SELECT * FROM user WHERE uid IN (:userIds)") suspend fun loadAllByIds(userIds: IntArray): List<User> @Query( """ SELECT * FROM user WHERE first_name LIKE :first AND last_name LIKE :last LIMIT 1 """ ) suspend fun findByName(first: String, last: String): User @Insert suspend fun insertAll(vararg users: User) @Delete suspend fun delete(user: User) }
डीएओ के बारे में ज़्यादा जानने के लिए, रूम के डीएओ इस्तेमाल करके डेटा ऐक्सेस करना लेख पढ़ें.
डेटाबेस
यहां दिए गए कोड में, डेटाबेस को सेव करने के लिए AppDatabase क्लास को तय किया गया है.
AppDatabase, डेटाबेस कॉन्फ़िगरेशन के बारे में बताता है. साथ ही, यह ऐप्लिकेशन के सेव किए गए डेटा का मुख्य ऐक्सेस पॉइंट होता है. डेटाबेस क्लास को इन शर्तों को पूरा करना होगा:
- क्लास को
@Databaseएनोटेशन के साथ एनोटेट किया जाना चाहिए. इसमेंentitiesऐरे शामिल होता है. इस ऐरे में, डेटाबेस से जुड़ी सभी डेटा इकाइयों की सूची होती है. - क्लास, ऐसी ऐब्स्ट्रैक्ट क्लास होनी चाहिए जो
RoomDatabaseको एक्सटेंड करती हो. - डेटाबेस से जुड़ी हर डीएओ क्लास के लिए, डेटाबेस क्लास को एक ऐब्सट्रैक्ट फ़ंक्शन तय करना होगा. इसमें कोई आर्ग्युमेंट नहीं होता और यह डीएओ क्लास का इंस्टेंस दिखाता है.
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
ध्यान दें: अगर आपका ऐप्लिकेशन किसी सिंगल प्रोसेस में चलता है, तो आपको कोई AppDatabase ऑब्जेक्ट इंस्टैंशिएट करते समय, सिंगलटन डिज़ाइन पैटर्न अपनाना चाहिए. हर RoomDatabase इंस्टेंस ज़्यादा महंगा नहीं होता है और आपको किसी एक प्रोसेस में, एक से ज़्यादा इंस्टेंस ऐक्सेस करने की शायद ही ज़रूरत पड़े.
अगर आपका ऐप्लिकेशन एक से ज़्यादा प्रोसेस में चलता है, तो अपने डेटाबेस बिल्डर इनवोकेशन में enableMultiInstanceInvalidation() शामिल करें. इस तरह, हर प्रोसेस में AppDatabase का एक इंस्टेंस होने पर, किसी एक प्रोसेस में शेयर की गई डेटाबेस फ़ाइल को अमान्य किया जा सकता है. साथ ही, यह अमान्य होने की जानकारी, अन्य प्रोसेस में मौजूद AppDatabase के इंस्टेंस में अपने-आप पहुंच जाती है.
इस्तेमाल
डेटा इकाई, डीएओ, और डेटाबेस ऑब्जेक्ट तय करने के बाद, डेटाबेस का इंस्टेंस बनाने के लिए यहां दिया गया कोड इस्तेमाल किया जा सकता है:
val db = Room.databaseBuilder<AppDatabase>(applicationContext, "database-name") .setDriver(AndroidSQLiteDriver()) .build()
इसके बाद, AppDatabase से ऐब्स्ट्रैक्ट फ़ंक्शन का इस्तेमाल करके, DAO का इंस्टेंस पाया जा सकता है. इसके बाद, डेटाबेस के साथ इंटरैक्ट करने के लिए, DAO इंस्टेंस से फ़ंक्शन इस्तेमाल किए जा सकते हैं:
val userDao = db.userDao() val users: List<User> = userDao.getAll()
अन्य संसाधन
Room के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें: