Room, Android में SQLite के साथ काम करने के लिए एक लाइब्रेरी है, जो Jetpack का हिस्सा है। यह रॉ SQLite के ऊपर एक एब्स्ट्रक्शन लेयर प्रदान करता है, टेबल निर्माण, क्वेरी निष्पादन और Kotlin व Java ऑब्जेक्ट्स में डेटा रूपांतरण को स्वचालित करता है। Android Developers के अनुसार, Room बिल्ड समय पर SQL क्वेरी को कंपाइल करता है, सिंटैक्स सहीता और Entity व टेबल के बीच संबंधों की जाँच करता है।
मुख्य बिंदु
Room Android Jetpack की एक पर्सिस्टेंस लाइब्रेरी है जो SQLite के लिए ऑब्जेक्ट-रिलेशनल मैपिंग प्रदान करती है। Room रॉ SQLite की तीन मुख्य समस्याओं को हल करता है: टेबल बनाने के लिए बड़ी मात्रा में boilerplate कोड लिखना, कंपाइल समय पर SQL क्वेरी सत्यापन की कमी, और Cursor का मैन्युअल रूप से ऑब्जेक्ट में रूपांतरण।
लाइब्रेरी एक एनोटेशन प्रोसेसर (kapt या KSP) का उपयोग करती है जो बिल्ड समय पर एब्स्ट्रैक्ट RoomDatabase और DAO क्लासेज का इम्प्लीमेंटेशन जनरेट करता है। यह सुनिश्चित करता है कि SQL में सिंटैक्स त्रुटियाँ और टाइप बेमेल एप्लिकेशन चलाने से पहले खोजे जाएँ, न कि Google Play पर प्रकाशित करने के बाद रनटाइम पर।
Google I/O 2023 के अनुसार, Room का उपयोग 68% Android एप्लिकेशन में किया जाता है जो स्थानीय डेटा के साथ काम करते हैं। यह पुराने SQLiteOpenHelper और ContentProvider के बजाय Google द्वारा सभी नए प्रोजेक्ट्स के लिए अनुशंसित डिवाइस पर डेटा स्टोरेज का मानक है।
Room को उन प्रोजेक्ट्स में शामिल करें जिनमें सर्वर से स्थानीय डेटा कैशिंग, ऑफलाइन मोड, या जटिल SQL क्वेरी चलाने की क्षमता के साथ संरचित उपयोगकर्ता डेटा संग्रहण की आवश्यकता है।
Room Android Jetpack का हिस्सा है और Google द्वारा स्थानीय डेटा के साथ काम करने वाले सभी नए प्रोजेक्ट्स के लिए आधिकारिक रूप से अनुशंसित है। Realm या ObjectBox के विपरीत, Room नेटिव SQLite का उपयोग करता है, जो DB Browser से DataGrip तक किसी भी तृतीय-पक्ष डेटाबेस टूल के साथ संगतता सुनिश्चित करता है। डेवलपर एप्लिकेशन की .db फ़ाइल खोल सकते हैं और सीधे SQL क्वेरी निष्पादित कर सकते हैं, जिससे डेवलपमेंट के दौरान डीबगिंग और डेटा विश्लेषण सरल हो जाता है।
Entity एक डेटा class है जो @Entity से एनोटेटेड है, जिसे Room डेटाबेस टेबल में बदल देता है। class का प्रत्येक फ़ील्ड टेबल का एक कॉलम बन जाता है, और प्रत्येक इंस्टेंस एक पंक्ति बन जाता है। Room फ़ील्ड तक पहुँचने के लिए रिफ्लेक्शन का उपयोग करता है, इसलिए अनिवार्य पहचानकर्ता के लिए @PrimaryKey एनोटेशन आवश्यक है।
@Entity एनोटेशन Room को बताता है कि class एक टेबल है। tableName पैरामीटर टेबल का नाम सेट करता है यदि यह class के नाम से भिन्न है। @PrimaryKey autoGenerate = true के माध्यम से ऑटो-जनरेशन समर्थन के साथ प्राथमिक कुंजी को परिभाषित करता है।
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "full_name")
val name: String,
@Ignore
val tempData: String?
)
@ColumnInfo टेबल में कॉलम का नाम निर्दिष्ट करता है यदि यह Kotlin फ़ील्ड नाम से भिन्न है। @Ignore किसी फ़ील्ड को टेबल से बाहर करता है — यह डेटाबेस में सहेजा नहीं जाएगा। @ForeignKey डिलीट या अपडेट पर कैस्केड ऑपरेशन के साथ टेबल के बीच संबंधों के लिए विदेशी कुंजियों का वर्णन करता है।
Room @Embedded एनोटेशन के माध्यम से नेस्टेड ऑब्जेक्ट को सपोर्ट करता है। नेस्टेड class के फ़ील्ड नाम विरोध से बचने के लिए प्रीफ़िक्स के साथ पैरेंट टेबल के कॉलम में विस्तारित होते हैं। उदाहरण के लिए, User में एम्बेडेड city और street फ़ील्ड वाला Address class, users टेबल में address_city और address_street कॉलम बनाएगा, जिससे सरल वैल्यू ऑब्जेक्ट के लिए अलग टेबल की आवश्यकता समाप्त हो जाती है।
Room केवल प्रिमिटिव टाइप और उनके रैपर को सपोर्ट करता है। लिस्ट, Date या कस्टम टाइप संग्रहीत करने के लिए, @TypeConverter का उपयोग करें — कस्टम टाइप और SQLite प्रिमिटिव के बीच रूपांतरण के लिए स्टैटिक मेथड, उदाहरण के लिए, List और JSON स्ट्रिंग के बीच।
DAO (डेटा एक्सेस ऑब्जेक्ट) एक इंटरफ़ेस या एब्स्ट्रैक्ट class है जो @Dao से एनोटेटेड है, जिसमें डेटा तक पहुँचने के लिए मेथड होते हैं। प्रत्येक मेथड SQL ऑपरेशन से एनोटेटेड होता है: @Insert, @Update, @Delete या स्पष्ट SQL क्वेरी के साथ @Query।
@Query एनोटेशन एक SQL स्ट्रिंग लेता है जिसे Room कंपाइल समय पर सिंटैक्स सहीता और Entity फ़ील्ड के साथ कॉलम नाम मिलान के लिए सत्यापित करता है। Room :paramName सिंटैक्स के माध्यम से पैरामीटराइज़्ड क्वेरी का समर्थन करता है।
@Dao
interface UserDao {
@Query("SELECT * FROM users WHERE id = :userId")
suspend fun getUserById(userId: Int): User?
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUser(user: User)
@Query("SELECT * FROM users ORDER BY name ASC")
fun getAllUsers(): Flow<List<User>>
}
@Insert डुप्लिकेट रिकॉर्ड डालने पर विरोध को संभालने के लिए OnConflictStrategy विकल्पों का समर्थन करता है। Flow रिटर्न टाइप के रूप में टेबल में प्रत्येक डेटा परिवर्तन पर रिएक्टिव UI अपडेट प्रदान करता है — सब्सक्रिप्शन किसी भी INSERT, UPDATE या DELETE पर स्वचालित रूप से पुनरारंभ होता है।
@Transaction एनोटेशन एक ही ट्रांज़ैक्शनल ब्लॉक में कई ऑपरेशन के परमाणु निष्पादन की गारंटी देता है। Room निष्पादन के दौरान डेटाबेस को लॉक करता है, कई थ्रेड से समवर्ती पहुँच के दौरान रेस कंडीशन को रोकता है।
RoomDatabase एक एब्स्ट्रैक्ट class है जो Entity और DAO को एकल डेटाबेस एक्सेस पॉइंट में जोड़ता है। यह स्कीमा संस्करण और Entity क्लासेज की सूची के साथ Room.databaseBuilder के माध्यम से बनाया जाता है। डेटाबेस इंस्टेंस को कई कनेक्शन से बचने के लिए lazy डेलिगेट के माध्यम से सिंगलटन के रूप में बनाया जाना चाहिए।
Room में माइग्रेशन एक Migration class है जो पुराने स्कीमा संस्करण से नए में संक्रमण के लिए SQL स्क्रिप्ट का वर्णन करता है। यदि स्कीमा बदलने पर माइग्रेशन प्रदान नहीं किया जाता है, तो Room IllegalStateException फेंकता है। यह एप्लिकेशन अपडेट करते समय आकस्मिक उपयोगकर्ता डेटा हानि से बचाता है।
val migration_1_2 = object : Migration(1, 2) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE users ADD COLUMN age INTEGER NOT NULL DEFAULT 0")
}
}
val db = Room.databaseBuilder(
getApplication(),
AppDatabase::class.java,
"app_database"
).addMigrations(migration_1_2)
.build()
डेवलपमेंट के लिए, आप fallbackToDestructiveMigration का उपयोग कर सकते हैं, जो संस्करण बेमेल होने पर पुराने डेटाबेस को हटाता है और नया बनाता है। यह मोड केवल डीबगिंग के लिए है — प्रोडक्शन रिलीज़ में उचित माइग्रेशन शामिल होना चाहिए।
डेटाबेस परीक्षण के लिए, Room एक विशेष class Room.inMemoryTestBuilder प्रदान करता है जो डिस्क पर सहेजे बिना मेमोरी में डेटाबेस बनाता है। प्रत्येक परीक्षण पूरा होने के बाद, डेटाबेस स्वचालित रूप से नष्ट हो जाता है, जिससे परीक्षण परिदृश्यों का पूर्ण अलगाव सुनिश्चित होता है। android-arch-core-testing लाइब्रेरी के संयोजन में, डेवलपर मैन्युअल रूप से स्थिति साफ़ किए बिना डेटाबेस जीवनचक्र प्रबंधित कर सकते हैं और माइग्रेशन सहीता सत्यापित कर सकते हैं।
Room का प्रदर्शन सीधे क्वेरी संरचना और इंडेक्स पर निर्भर करता है। धीमी क्वेरी के विश्लेषण के लिए, Room enableQueryCallback फ़्लैग प्रदान करता है, जो निष्पादन समय के साथ सभी SQL क्वेरी लॉग करता है। डेवलपर इस लॉग का उपयोग 100 मिलीसेकंड से अधिक समय लेने वाली क्वेरी खोजने और @Entity में @Index एनोटेशन के माध्यम से कम्पोजिट इंडेक्स जोड़कर या @Relation का उपयोग करके सबक्वेरी को सीधे JOIN ऑपरेशन में फिर से लिखकर उन्हें ऑप्टिमाइज़ कर सकते हैं।
Room SQLCipher के माध्यम से डेटाबेस एन्क्रिप्शन का भी समर्थन करता है। net.zetetic:android-database-sqlcipher लाइब्रेरी जोड़ना और मानक के बजाय SupportFactory का उपयोग DAO क्वेरी या Entity संरचना को बदले बिना डिस्क पर सभी डेटा का पारदर्शी एन्क्रिप्शन प्रदान करता है। यह उपयोगकर्ताओं के व्यक्तिगत डेटा को संभालने वाले अनुप्रयोगों के लिए आवश्यक है और GDPR और व्यक्तिगत डेटा संरक्षण पर रूसी संघीय कानून 152-FZ का अनुपालन करता है। एन्क्रिप्शन पासवर्ड को रूट किए गए उपकरणों पर टूलिंग के माध्यम से निष्कर्षण से बचाने के लिए Android Keystore में संग्रहीत किया जा सकता है।
Room संस्करण 2.1 से Kotlin Coroutines को मूल रूप से समर्थन करता है। DAO मेथड suspend फ़ंक्शन हो सकते हैं जो मुख्य थ्रेड को ब्लॉक किए बिना बैकग्राउंड थ्रेड में क्वेरी निष्पादित करते हैं। Room स्वचालित रूप से डिस्पैचर प्रबंधित करता है, पढ़ने और लिखने की क्वेरी के लिए Dispatchers.IO का उपयोग करता है।
रिएक्टिव क्वेरी के लिए, Room एक Flow लौटाता है — एक कोल्ड डेटा स्ट्रीम जो प्रभावित टेबल में प्रत्येक परिवर्तन पर एक नया मान उत्सर्जित करती है। ViewModel stateIn या collect के माध्यम से Flow की सदस्यता लेता है, एडाप्टर को मैन्युअल रूप से सूचित किए बिना स्वचालित UI अपडेट प्रदान करता है।
Room एक विशेष PagingSource इम्प्लीमेंटेशन के माध्यम से Paging 3 का भी समर्थन करता है जो SQLite से पेज दर पेज डेटा लोड करता है। यह हजारों रिकॉर्ड वाली बड़ी सूचियों के लिए कुशल है: Paging 3 केवल स्क्रीन पर दिखाई देने वाली पंक्तियों को लोड करता है और डेटाबेस परिवर्तनों पर उन्हें स्वचालित रूप से अपडेट करता है।
समाचार फ़ीड, ऑपरेशन लॉग या ऑफ़लाइन एक्सेस और अनंत स्क्रॉलिंग के साथ उत्पाद सूचियाँ प्रदर्शित करने के लिए Room के साथ Paging 3 का उपयोग करें।
अक्सर पूछे जाने वाले प्रश्न
Room टेबल निर्माण, Cursor-से-ऑब्जेक्ट रूपांतरण और कंपाइल समय पर SQL सत्यापन को स्वचालित करता है। SQLiteOpenHelper को मैन्युअल रूप से स्कीमा लिखने, Cursor संभालने की आवश्यकता होती है, और एप्लिकेशन चलाने से पहले क्वेरी सत्यापन नहीं होता है, जिससे त्रुटियों का जोखिम बढ़ जाता है।
हाँ, Entity बदलने पर (फ़ील्ड जोड़ना/हटाना, टाइप बदलना), माइग्रेशन आवश्यक है। इसके बिना, Room स्टार्टअप पर IllegalStateException फेंकता है। डेवलपमेंट के लिए, आप fallbackToDestructiveMigration सक्षम कर सकते हैं, लेकिन प्रोडक्शन रिलीज़ में सही माइग्रेशन स्क्रिप्ट आवश्यक हैं।
Room कैस्केड ऑपरेशन के लिए @ForeignKey और नेस्टेड ऑब्जेक्ट के लिए @Relation का समर्थन करता है। जटिल JOIN क्वेरी के लिए, @Embedded और @Relation के माध्यम से नेस्टेड एंटिटी के साथ POJO लौटाने वाले @Query के साथ @Transaction एनोटेशन का उपयोग करें।
हाँ, Room Java के साथ पूरी तरह से संगत है। suspend फ़ंक्शन के बजाय LiveData या RxJava Observable का उपयोग करें; Flow के बजाय LiveData का उपयोग करें। Java के साथ Room सभी समान एनोटेशन का समर्थन करता है, लेकिन एसिंक्रोनस ऑपरेशन के लिए अधिक boilerplate कोड की आवश्यकता होती है।
Room Zetetic के SQLCipher के माध्यम से एन्क्रिप्शन का समर्थन करता है। Room.databaseBuilder के बजाय, net.zetetic:android-database-sqlcipher लाइब्रेरी से SupportFactory का उपयोग करें, एन्क्रिप्शन पासवर्ड पास करें। डिस्क पर सभी डेटा DAO क्वेरी के लिए पारदर्शी रूप से एन्क्रिप्ट किया जाएगा।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें