SQLite से रूम पर माइग्रेट करना

रूम परसिस्टेंस लाइब्रेरी, SQLite एपीआई का सीधे तौर पर इस्तेमाल करने के मुकाबले कई फ़ायदे देती है:

  • SQL क्वेरी के कंपाइल होने में लगने वाले समय की पुष्टि
  • सुविधाजनक एनोटेशन, जो बार-बार इस्तेमाल किए जाने वाले और गड़बड़ी की आशंका वाले बॉयलरप्लेट कोड को कम करते हैं
  • डेटाबेस माइग्रेशन के लिए बेहतर पाथ

अगर आपके ऐप्लिकेशन में, रूम के अलावा SQLite का इस्तेमाल किया जा रहा है, तो रूम पर माइग्रेट करने का तरीका जानने के लिए, यह पेज पढ़ें. अगर आपके ऐप्लिकेशन में SQLite का पहली बार इस्तेमाल किया जा रहा है, तो सामान्य इस्तेमाल के लिए, रूम का इस्तेमाल करके, डेटा को किसी स्थानीय डेटाबेस में सेव करना लेख देखें.

माइग्रेट करने का तरीका

SQLite के इस्तेमाल को रूम पर माइग्रेट करने के लिए, यह तरीका अपनाएं. अगर SQLite का इस्तेमाल करने के दौरान, बड़े डेटाबेस या जटिल क्वेरी का इस्तेमाल किया जाता है, तो रूम पर धीरे-धीरे माइग्रेट करना बेहतर हो सकता है. इंक्रीमेंटल माइग्रेशन की रणनीति के बारे में ज़्यादा जानने के लिए, इंक्रीमेंटल माइग्रेशन लेख देखें.

डिपेंडेंसी अपडेट करना

अपने ऐप्लिकेशन में रूम का इस्तेमाल करने के लिए, आपको अपने ऐप्लिकेशन की build.gradle फ़ाइल में सही डिपेंडेंसी शामिल करनी होंगी. रूम की डिपेंडेंसी के बारे में ज़्यादा जानने के लिए, सेटअप लेख देखें.

मॉडल क्लास को डेटा एंटिटी में अपडेट करना

रूम, डेटा एंटिटी का इस्तेमाल डेटाबेस में टेबल दिखाने के लिए करता है. हर एंटिटी क्लास, एक टेबल को दिखाती है. इसमें ऐसी प्रॉपर्टी होती हैं जो उस टेबल में कॉलम दिखाती हैं. अपनी मौजूदा मॉडल क्लास को रूम एंटिटी के तौर पर अपडेट करने के लिए, यह तरीका अपनाएं:

  1. क्लास के एलान को @Entity से एनोटेट करें, ताकि यह पता चले कि यह रूम एंटिटी है. ज़रूरी नहीं है कि tableName प्रॉपर्टी का इस्तेमाल करके, यह बताया जाए कि बनने वाली टेबल का नाम, क्लास के नाम से अलग होना चाहिए.
  2. प्राइमरी की प्रॉपर्टी को @PrimaryKey से एनोटेट करें.
  3. अगर बनने वाली टेबल के किसी कॉलम का नाम, उससे जुड़ी प्रॉपर्टी के नाम से अलग होना चाहिए, तो उस प्रॉपर्टी को @ColumnInfo से एनोटेट करें और name प्रॉपर्टी को सही कॉलम नाम पर सेट करें.
  4. अगर क्लास में ऐसी प्रॉपर्टी हैं जिन्हें आपको डेटाबेस में सेव नहीं करना है, तो उन प्रॉपर्टी को @Ignore से एनोटेट करें. इससे रूम उनसे जुड़ी टेबल में कॉलम नहीं बनाएगा.
  5. अगर क्लास में एक से ज़्यादा कंस्ट्रक्टर हैं, तो यह बताएं कि रूम को किस कंस्ट्रक्टर का इस्तेमाल करना चाहिए. इसके लिए, बाकी सभी कंस्ट्रक्टर को @Ignore से एनोटेट करें.

@Entity(tableName = "users")
data class User(
    @PrimaryKey @ColumnInfo(name = "userid") val id: String,
    @ColumnInfo(name = "username") val userName: String?,
    @ColumnInfo(name = "last_update") val date: Date?,
)

डीएओ बनाना

रूम, डेटाबेस को ऐक्सेस करने वाले फ़ंक्शन तय करने के लिए, डेटा ऐक्सेस ऑब्जेक्ट (डीएओ) का इस्तेमाल करता है. अपनी मौजूदा क्वेरी फ़ंक्शन को डीएओ से बदलने के लिए, रूम के डीएओ इस्तेमाल करके, डेटा को ऐक्सेस करना में दिया गया तरीका अपनाएं.

डेटाबेस क्लास बनाना

रूम के इस्तेमाल के दौरान, डेटाबेस के इंस्टेंस को मैनेज करने के लिए, डेटाबेस क्लास का इस्तेमाल किया जाता है. आपकी डेटाबेस क्लास को RoomDatabase तक बढ़ाया जाना चाहिए. साथ ही, इसमें तय की गई सभी एंटिटी और डीएओ का रेफ़रंस होना चाहिए.

@Database(entities = [User::class], version = 2)
@ColumnTypeConverters(DateConverter::class)
abstract class UsersDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

माइग्रेशन पाथ तय करना

डेटाबेस का वर्शन नंबर बदलने की वजह से, आपको मौजूदा डेटाबेस के डेटा को सेव करने के लिए, Migration ऑब्जेक्ट तय करना होगा. अगर डेटाबेस स्कीमा में कोई बदलाव नहीं होता है, तो यह माइग्रेशन खाली हो सकता है.

val MIGRATION_1_2 = object : Migration(1, 2) {
    override suspend fun migrate(connection: SQLiteConnection) {
        // Empty implementation, because the schema isn't changing.
    }
}

रूम में डेटाबेस माइग्रेशन पाथ के बारे में ज़्यादा जानने के लिए, अपना डेटाबेस माइग्रेट करना लेख देखें.

डेटाबेस इंस्टैंशिएशन अपडेट करना

डेटाबेस क्लास और माइग्रेशन पाथ तय करने के बाद, Room.databaseBuilder का इस्तेमाल करके, माइग्रेशन पाथ लागू करके अपने डेटाबेस का इंस्टेंस बनाया जा सकता है:

val db =
    Room.databaseBuilder<UsersDatabase>(applicationContext, "database-name")
        .addMigrations(MIGRATION_1_2)
        .build()

आपने जो लागू किया है उसकी जांच करना

पक्का करें कि आपने रूम के नए इस्तेमाल की जांच की हो:

इंक्रीमेंटल माइग्रेशन

अगर आपके ऐप्लिकेशन में बड़ा और जटिल डेटाबेस इस्तेमाल किया जाता है, तो हो सकता है कि आपके ऐप्लिकेशन को रूम पर एक साथ माइग्रेट करना मुमकिन न हो. इसके बजाय, पहले चरण के तौर पर, डेटा एंटिटी और रूम डेटाबेस को लागू किया जा सकता है. इसके बाद, क्वेरी फ़ंक्शन को डीएओ में माइग्रेट किया जा सकता है.

इंक्रीमेंटल माइग्रेशन लागू करने के लिए, androidx.room3:room3-sqlite-wrapper आर्टफ़ैक्ट से roomDatabase.getSupportWrapper एक्सटेंशन फ़ंक्शन का इस्तेमाल करके, SupportSQLiteDatabase कंपैटिबिलिटी रैपर पाएं. इस रैपर की मदद से, Android SQLite एपीआई का इस्तेमाल करके, रूम से मैनेज किए जाने वाले डेटाबेस पर, Android-स्टाइल की SQL क्वेरी सीधे तौर पर चलाई जा सकती हैं:

// Get SupportSQLiteDatabase wrapper
val legacyDb = roomDatabase.getSupportWrapper()
legacyDb.execSQL("INSERT INTO users ...")