Room का इस्तेमाल करके, स्थानीय डेटाबेस में डेटा सेव करना. यह Android Jetpack का हिस्सा है.
जिन ऐप्लिकेशन में स्ट्रक्चर्ड डेटा की बड़ी मात्रा को मैनेज किया जाता है उन्हें स्थानीय तौर पर डेटा सेव करने से काफ़ी फ़ायदा मिल सकता है. इसका सबसे आम इस्तेमाल, काम के डेटा को कैश मेमोरी में सेव करना है. इससे जब डिवाइस नेटवर्क ऐक्सेस नहीं कर पाता, तब भी आपके उपयोगकर्ता ऑफ़लाइन होने पर भी उस कॉन्टेंट को ब्राउज़ कर सकते हैं.
Room परसिस्टेंस लाइब्रेरी, SQLite पर एक ऐब्स्ट्रैक्शन लेयर उपलब्ध कराती है. इससे SQLite की पूरी क्षमता का इस्तेमाल करते हुए, डेटाबेस को आसानी से ऐक्सेस किया जा सकता है. खास तौर पर, Room से ये फ़ायदे मिलते हैं:
- SQL क्वेरी की कंपाइल-टाइम पुष्टि.
- सुविधाजनक एनोटेशन, जिनसे बार-बार और गड़बड़ी की आशंका वाले बॉयलरप्लेट कोड को कम किया जा सकता है.
- डेटाबेस माइग्रेशन के लिए बेहतर पाथ.
हमारा सुझाव है कि SQLite API का सीधे इस्तेमाल करने के बजाय, Room का इस्तेमाल करें.
सेटअप
अपने ऐप्लिकेशन में Room का इस्तेमाल करने के लिए, अपने मॉड्यूल की build.gradle.kts फ़ाइल में ये डिपेंडेंसी जोड़ें. Room 3.0 के लिए, एनोटेशन प्रोसेसिंग के लिए KSP की ज़रूरत होती है.
Kotlin
dependencies { val room_version = "3.0.3" implementation("androidx.room3:room3-runtime:$room_version") ksp("androidx.room3:room3-compiler:$room_version") }
Groovy
dependencies { def room_version = "3.0.3" implementation "androidx.room3:room3-runtime:$room_version" ksp "androidx.room3:room3-compiler:$room_version" }
मुख्य कॉम्पोनेंट
Room में तीन बड़े कॉम्पोनेंट हैं:
- डेटाबेस क्लास, जिसमें डेटाबेस होता है. यह आपके ऐप्लिकेशन के सेव किए गए डेटा से जुड़े कनेक्शन के लिए, मुख्य ऐक्सेस पॉइंट के तौर पर काम करती है.
- डेटा इकाइयां, जो आपके ऐप्लिकेशन के डेटाबेस में टेबल के तौर पर दिखती हैं.
- डेटा ऐक्सेस ऑब्जेक्ट (डीएओ), जो ऐसे फ़ंक्शन उपलब्ध कराते हैं जिनका इस्तेमाल करके, आपका ऐप्लिकेशन डेटाबेस में डेटा के लिए क्वेरी कर सकता है, उसे अपडेट कर सकता है, उसमें डेटा जोड़ सकता है, और उसे मिटा सकता है.
डेटाबेस क्लास, आपके ऐप्लिकेशन को उस डेटाबेस से जुड़े डीएओ के इंस्टेंस उपलब्ध कराती है. इसके बाद, ऐप्लिकेशन डीएओ का इस्तेमाल करके, डेटाबेस से डेटा को उससे जुड़ी डेटा इकाई ऑब्जेक्ट के इंस्टेंस के तौर पर वापस पा सकता है. ऐप्लिकेशन, तय की गई डेटा इकाइयों का इस्तेमाल करके, उनसे जुड़ी टेबल की लाइनों को अपडेट कर सकता है. साथ ही, नई लाइनें भी बना सकता है. पहली इमेज में, 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 नाम के डीएओ के बारे में बताया गया है. 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) }
डीएओ के बारे में ज़्यादा जानने के लिए, Room डीएओ का इस्तेमाल करके डेटा ऐक्सेस करना लेख पढ़ें.
डेटाबेस
यहां दिए गए कोड में, डेटाबेस को सेव करने के लिए 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 के ऐब्स्ट्रैक्ट फ़ंक्शन का इस्तेमाल किया जा सकता है. इसके बाद, डेटाबेस के साथ इंटरैक्ट करने के लिए, डीएओ इंस्टेंस के फ़ंक्शन का इस्तेमाल किया जा सकता है:
val userDao = db.userDao() val users: List<User> = userDao.getAll()
अन्य संसाधन
Room के बारे में ज़्यादा जानने के लिए, ये लेख पढ़ें और वीडियो देखें: