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

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

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

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

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

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

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

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

मॉडल क्लास को डेटा इकाइयों में अपडेट करना

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

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

Kotlin

@Entity(tableName = "users")
data class User(
  @PrimaryKey
  @ColumnInfo(name = "userid") val mId: String,
  @ColumnInfo(name = "username") val mUserName: String?,
  @ColumnInfo(name = "last_update") val mDate: Date?,
)

Java

@Entity(tableName = "users")
public class User {

  @PrimaryKey
  @ColumnInfo(name = "userid")
  private String mId;

  @ColumnInfo(name = "username")
  private String mUserName;

  @ColumnInfo(name = "last_update")
  private Date mDate;

  @Ignore
  public User(String userName) {
    mId = UUID.randomUUID().toString();
    mUserName = userName;
    mDate = new Date(System.currentTimeMillis());
  }

  public User(String id, String userName, Date date) {
    this.mId = id;
    this.mUserName = userName;
    this.mDate = date;
  }

}

डीएओ बनाएं

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

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

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

Kotlin

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

Java

@Database(entities = {User.class}, version = 2)
@TypeConverters(DateConverter.class)
public abstract class UsersDatabase extends RoomDatabase {
  public abstract UserDao userDao();
}

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

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

Kotlin

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

Java

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
  @Override
  public void migrate(SupportSQLiteDatabase database) {
    // Empty implementation, because the schema isn't changing.
  }
};

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

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

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

Kotlin

val db = Room.databaseBuilder(
          applicationContext,
          AppDatabase::class.java, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build()

Java

db = Room.databaseBuilder(
          context.getApplicationContext(),
          UsersDatabase.class, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build();

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

पक्का करें कि आपने नए चैट रूम को लागू करने की जांच कर ली है:

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

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

अन्य संसाधन

SQLite से Room पर माइग्रेट करने के बारे में ज़्यादा जानने के लिए, यहां दी गई अतिरिक्त जानकारी देखें संसाधन:

ब्लॉग