Room का इस्तेमाल करके, डेटा को किसी स्थानीय डेटाबेस में सेव करना यह Android Jetpack का हिस्सा है.
जिन ऐप्लिकेशन में ज़्यादा स्ट्रक्चर्ड डेटा मैनेज किया जाता है उन्हें उस डेटा को स्थानीय स्टोरेज में सेव करने से काफ़ी फ़ायदा मिल सकता है. इसका सबसे सामान्य इस्तेमाल, काम के डेटा को कैश मेमोरी में सेव करना है, ताकि जब डिवाइस नेटवर्क को ऐक्सेस न कर पाए, तब भी उपयोगकर्ता ऑफ़लाइन रहते हुए उस कॉन्टेंट को ब्राउज़ कर सके.
रूम परसिस्टेंस लाइब्रेरी, SQLite को लेकर एक ऐब्स्ट्रैक्शन लेयर उपलब्ध कराती है, ताकि डेटाबेस को ज़्यादा अच्छे से ऐक्सेस किया जा सके. खास तौर पर, Room से ये फ़ायदे मिलते हैं:
- एसक्यूएल क्वेरी के कंपाइल होने में लगने वाले समय की पुष्टि.
- सुविधाजनक एनोटेशन, जो बार-बार इस्तेमाल होने वाले और गड़बड़ी वाले बॉयलरप्लेट कोड को कम करते हैं.
- डेटाबेस माइग्रेशन पाथ को आसान बनाया गया है.
इन बातों को ध्यान में रखते हुए, हमारा सुझाव है कि आप सीधे SQLite API का इस्तेमाल करने के बजाय, Room का इस्तेमाल करें.
सेटअप
अपने ऐप्लिकेशन में Room का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन की
build.gradle
फ़ाइल में ये डिपेंडेंसी जोड़ें.
Kotlin
dependencies { val room_version = "2.6.1" implementation("androidx.room:room-runtime:$room_version") // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP) // See Add the KSP plugin to your project ksp("androidx.room:room-compiler:$room_version") // If this project only uses Java source, use the Java annotationProcessor // No additional plugins are necessary annotationProcessor("androidx.room:room-compiler:$room_version") // optional - Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:$room_version") // optional - RxJava2 support for Room implementation("androidx.room:room-rxjava2:$room_version") // optional - RxJava3 support for Room implementation("androidx.room:room-rxjava3:$room_version") // optional - Guava support for Room, including Optional and ListenableFuture implementation("androidx.room:room-guava:$room_version") // optional - Test helpers testImplementation("androidx.room:room-testing:$room_version") // optional - Paging 3 Integration implementation("androidx.room:room-paging:$room_version") }
Groovy
dependencies { def room_version = "2.6.1" implementation "androidx.room:room-runtime:$room_version" // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP) // See KSP Quickstart to add KSP to your build ksp "androidx.room:room-compiler:$room_version" // If this project only uses Java source, use the Java annotationProcessor // No additional plugins are necessary annotationProcessor "androidx.room:room-compiler:$room_version" // optional - RxJava2 support for Room implementation "androidx.room:room-rxjava2:$room_version" // optional - RxJava3 support for Room implementation "androidx.room:room-rxjava3:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture implementation "androidx.room:room-guava:$room_version" // optional - Test helpers testImplementation "androidx.room:room-testing:$room_version" // optional - Paging 3 Integration implementation "androidx.room:room-paging:$room_version" }
मुख्य कॉम्पोनेंट
रूम में तीन बड़े कॉम्पोनेंट हैं:
- डेटाबेस क्लास, जिसमें डेटाबेस होता है. साथ ही, यह आपके ऐप्लिकेशन के सेव किए गए डेटा तक जाने के लिए, मुख्य ऐक्सेस पॉइंट के तौर पर काम करती है.
- डेटा इकाइयां, जो आपके ऐप्लिकेशन के डेटाबेस में टेबल दिखाती हैं.
- डेटा ऐक्सेस ऑब्जेक्ट (डीएओ), जो ऐसे तरीके उपलब्ध कराते हैं जिनका इस्तेमाल करके आपका ऐप्लिकेशन, डेटाबेस में डेटा को क्वेरी करने, अपडेट करने, डालने, और मिटाने के लिए कर सकता है.
डेटाबेस क्लास, आपके ऐप्लिकेशन को उस डेटाबेस से जुड़े डीएओ के इंस्टेंस उपलब्ध कराती है. इसके बाद, ऐप्लिकेशन डीएओ का इस्तेमाल करके, डेटाबेस से डेटा को इकट्ठा कर सकता है. यह डेटा, डेटा इकाई के ऑब्जेक्ट के इंस्टेंस के तौर पर डेटाबेस से इकट्ठा किया जाता है. ऐप्लिकेशन, तय की गई डेटा इकाइयों का इस्तेमाल करके, उनसे जुड़ी टेबल की पंक्तियों को अपडेट कर सकता है. इसके अलावा, वह नई पंक्तियां जोड़ने के लिए भी इनका इस्तेमाल कर सकता है. पहली इमेज में, Room के अलग-अलग कॉम्पोनेंट के बीच के संबंध को दिखाया गया है.
लागू करने का सैंपल
इस सेक्शन में, एक डेटा इकाई और एक डीओए के साथ Room डेटाबेस को लागू करने का उदाहरण दिया गया है.
डेटा इकाई
नीचे दिया गया कोड, User
डेटा इकाई के बारे में बताता है. User
का हर इंस्टेंस, ऐप्लिकेशन के डेटाबेस में user
टेबल की एक लाइन को दिखाता है.
Kotlin
@Entity data class User( @PrimaryKey val uid: Int, @ColumnInfo(name = "first_name") val firstName: String?, @ColumnInfo(name = "last_name") val lastName: String? )
Java
@Entity public class User { @PrimaryKey public int uid; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name") public String lastName; }
Room में डेटा इकाइयों के बारे में ज़्यादा जानने के लिए, Room इकाइयों का इस्तेमाल करके डेटा तय करना लेख पढ़ें.
डेटा ऐक्सेस ऑब्जेक्ट (डीएओ)
यहां दिया गया कोड, UserDao
नाम के डीएओ के बारे में बताता है. UserDao
, ऐसे तरीकों को उपलब्ध कराता है जिनका इस्तेमाल बाकी ऐप्लिकेशन, user
टेबल में मौजूद डेटा के साथ इंटरैक्ट करने के लिए करते हैं.
Kotlin
@Dao interface UserDao { @Query("SELECT * FROM user") fun getAll(): List<User> @Query("SELECT * FROM user WHERE uid IN (:userIds)") fun loadAllByIds(userIds: IntArray): List<User> @Query("SELECT * FROM user WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") fun findByName(first: String, last: String): User @Insert fun insertAll(vararg users: User) @Delete fun delete(user: User) }
Java
@Dao public interface UserDao { @Query("SELECT * FROM user") List<User> getAll(); @Query("SELECT * FROM user WHERE uid IN (:userIds)") List<User> loadAllByIds(int[] userIds); @Query("SELECT * FROM user WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") User findByName(String first, String last); @Insert void insertAll(User... users); @Delete void delete(User user); }
डीएओ के बारे में ज़्यादा जानने के लिए, रूम के डीएओ का इस्तेमाल करके डेटा ऐक्सेस करना लेख पढ़ें.
डेटाबेस
यहां दिया गया कोड, डेटाबेस को सेव करने के लिए AppDatabase
क्लास तय करता है.
AppDatabase
, डेटाबेस कॉन्फ़िगरेशन तय करता है और सेव किए गए डेटा के लिए, ऐप्लिकेशन के मुख्य ऐक्सेस पॉइंट के तौर पर काम करता है. डेटाबेस क्लास को इन शर्तों को पूरा करना होगा:
- क्लास को
@Database
एनोटेशन के साथ एनोटेट किया जाना चाहिए. इसमेंentities
कलेक्शन शामिल होना चाहिए, जिसमें डेटाबेस से जुड़ी सभी डेटा इकाइयों की सूची हो. - क्लास, ऐब्स्ट्रैक्ट क्लास होनी चाहिए, जो
RoomDatabase
को एक्सटेंड करती हो. - डेटाबेस से जुड़ी हर डीएओ क्लास के लिए, डेटाबेस क्लास को एक ऐसा ऐब्सट्रैक्ट मैथड तय करना होगा जिसमें कोई आर्ग्युमेंट न हो और जो डीएओ क्लास का इंस्टेंस रिटर्न करता हो.
Kotlin
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Java
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
ध्यान दें: अगर आपका ऐप्लिकेशन किसी सिंगल प्रोसेस में चलता है, तो आपको कोई AppDatabase
ऑब्जेक्ट इंस्टैंशिएट करते समय, सिंगलटन डिज़ाइन पैटर्न अपनाना चाहिए. हर RoomDatabase
इंस्टेंस ज़्यादा महंगा नहीं होता है और आपको किसी एक प्रोसेस में, एक से ज़्यादा इंस्टेंस ऐक्सेस करने की शायद ही ज़रूरत पड़े.
अगर आपका ऐप्लिकेशन एक से ज़्यादा प्रोसेस में चलता है, तो अपने डेटाबेस बिल्डर के invocaton में enableMultiInstanceInvalidation()
शामिल करें. इस तरह, जब आपके पास हर प्रोसेस में AppDatabase
का एक इंस्टेंस होता है, तो एक प्रोसेस में शेयर की गई डेटाबेस फ़ाइल को अमान्य किया जा सकता है. साथ ही, अमान्य होने की यह जानकारी, अन्य प्रोसेस में AppDatabase
के इंस्टेंस में अपने-आप भेज दी जाती है.
इस्तेमाल
डेटा इकाई, डीएओ, और डेटाबेस ऑब्जेक्ट तय करने के बाद, डेटाबेस का इंस्टेंस बनाने के लिए, यहां दिए गए कोड का इस्तेमाल किया जा सकता है:
Kotlin
val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build()
Java
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
इसके बाद, AppDatabase
के ऐब्स्ट्रैक्ट मैथड का इस्तेमाल करके, डीएओ का इंस्टेंस पाया जा सकता है. इसके बाद, डेटाबेस के साथ इंटरैक्ट करने के लिए, डीएओ इंस्टेंस के तरीकों का इस्तेमाल किया जा सकता है:
Kotlin
val userDao = db.userDao() val users: List<User> = userDao.getAll()
Java
UserDao userDao = db.userDao(); List<User> users = userDao.getAll();
अन्य संसाधन
Room के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें: