نقل البيانات من SQLite إلى غرفة

توفر مكتبة استمرار الغرفة عددًا من المزايا مقارنةً باستخدام واجهات برمجة تطبيقات SQLite مباشرةً:

  • التحقق في وقت التجميع من استعلامات SQL (لغة الاستعلام البنيوية)
  • التعليقات التوضيحية الملائمة التي تقلل من الرموز النموذجية المتكررة والمعرّضة للأخطاء.
  • مسارات نقل بيانات قواعد البيانات المُبسّطة

إذا كان تطبيقك يستخدم حاليًا عملية تنفيذ خاصة بلغة SQLite بدون استخدام "الغرفة"، يُرجى الاطّلاع على هذه الصفحة لمعرفة كيفية نقل بيانات تطبيقك لاستخدام الغرفة بدلاً من ذلك. إذا كانت الغرفة هي أول عملية تنفيذ من SQLite تستخدمها في تطبيقك، يُرجى الاطّلاع على حفظ البيانات في قاعدة بيانات محلية باستخدام Room للحصول على معلومات الاستخدام الأساسية.

خطوات نقل البيانات

عليك تنفيذ الخطوات التالية لنقل بيانات تنفيذ SQLite إلى Room. إذا كان تطبيق SQLite يستخدم قاعدة بيانات كبيرة أو طلبات بحث معقدة، قد تفضّل نقل البيانات إلى Room تدريجيًا. يمكنك الاطّلاع على النقل التزايدي للاطِّلاع على استراتيجية نقل بيانات تزايدية.

تحديث التبعيات

لاستخدام Room في تطبيقك، يجب تضمين العناصر الاعتمادية المناسبة في ملف build.gradle الخاص بتطبيقك. راجِع الإعداد للاطّلاع على أحدث اعتماديات للغرفة.

تعديل فئات النموذج إلى كيانات البيانات

تستخدم الغرفة كيانات البيانات لتمثيل الجداول في قاعدة البيانات. تمثل كل فئة كيان جدولاً ويحتوي على حقول تمثل الأعمدة في هذا الجدول. اتّبِع الخطوات التالية لتعديل فئات النماذج الحالية لتصبح كيانات للغرفة:

  1. يمكنك التعليق التوضيحي على بيان الفئة باستخدام @Entity للإشارة إلى أنّه كيان غرفة. يمكنك استخدام السمة tableName اختياريًا للإشارة إلى أنّ اسم الجدول الناتج يجب أن يكون مختلفًا عن اسم الفئة.
  2. أضِف تعليقًا توضيحيًا على حقل المفتاح الأساسي باستخدام @PrimaryKey.
  3. إذا كان أي من الأعمدة في الجدول الناتج يجب أن يكون له اسم مختلف عن اسم الحقل المقابل، أضِف تعليقًا توضيحيًا على الحقل باستخدام @ColumnInfo واضبط سمة name على اسم العمود الصحيح.
  4. إذا كان الصف يحتوي على حقول لا تريد الاحتفاظ بها في قاعدة البيانات، يمكنك إضافة تعليقات توضيحية إلى هذه الحقول باستخدام @Ignore للإشارة إلى أن Room يجب ألا تنشئ أعمدة لها في الجدول المقابل.
  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;
  }

}

إنشاء وحدات DAO

تستخدم الغرفة كائنات الوصول إلى البيانات (DAOs) لتحديد الطرق التي يمكنها الوصول إلى قاعدة البيانات. اتّبِع الإرشادات الواردة في الوصول إلى البيانات باستخدام عمليات DAOs للغرف لاستبدال طرق طلبات البحث الحالية بطرق DAO.

إنشاء فئة قاعدة بيانات

تستخدم عمليات تنفيذ Room فئة قاعدة بيانات لإدارة مثيل قاعدة البيانات. يجب أن يوسِّع فئة قاعدة البيانات RoomDatabase وأن تشير إلى جميع الكيانات وقوائم DAO التي حدّدتها.

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 للإشارة إلى مسار نقل البيانات حتى تحتفظ Room بالبيانات الحالية في قاعدة البيانات. وطالما لم يتغير مخطط قاعدة البيانات، فقد يكون هذا تنفيذًا فارغًا.

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();

التحقّق من نجاح العملية

احرِص على اختبار عملية تنفيذ الغرفة الجديدة:

النقل التزايدي

إذا كان تطبيقك يستخدم قاعدة بيانات كبيرة ومعقدة، قد لا يكون من الممكن نقل تطبيقك إلى الغرفة دُفعة واحدة. بدلاً من ذلك، يمكنك اختياريًا تنفيذ كيانات البيانات وقاعدة بيانات الغرفة كخطوة أولى، ثم نقل طرق الاستعلام إلى أنظمة DAO لاحقًا. يمكنك إجراء ذلك من خلال استبدال فئة مساعد قاعدة البيانات المخصّصة بالكائن SupportSQLiteOpenHelper الذي تتلقّاه من RoomDatabase.getOpenHelper().

مراجع إضافية

لمعرفة المزيد من المعلومات حول نقل البيانات من SQLite إلى Room، يُرجى الاطّلاع على المراجع الإضافية التالية:

المدوّنات