از SQLite به Room مهاجرت کنید

کتابخانه تداوم اتاق چندین مزیت را نسبت به استفاده مستقیم از APIهای SQLite ارائه می دهد:

  • تأیید زمان کامپایل پرس و جوهای SQL
  • حاشیه نویسی راحت که کد دیگ بخار تکراری و مستعد خطا را به حداقل می رساند
  • مسیرهای مهاجرت پایگاه داده ساده

اگر برنامه شما در حال حاضر از اجرای SQLite غیر رومی استفاده می کند، این صفحه را بخوانید تا با نحوه انتقال برنامه خود به استفاده از Room به جای آن آشنا شوید. اگر Room اولین پیاده‌سازی SQLite است که در برنامه خود استفاده می‌کنید، برای اطلاعات اولیه استفاده از اتاق، به ذخیره داده‌ها در پایگاه داده محلی با استفاده از Room مراجعه کنید.

مراحل مهاجرت

مراحل زیر را برای انتقال پیاده سازی SQLite به Room انجام دهید. اگر پیاده سازی SQLite شما از یک پایگاه داده بزرگ یا پرس و جوهای پیچیده استفاده می کند، ممکن است ترجیح دهید به تدریج به اتاق مهاجرت کنید. برای استراتژی مهاجرت افزایشی به مهاجرت افزایشی مراجعه کنید.

به روز رسانی وابستگی ها

برای استفاده از Room در برنامه خود، باید وابستگی های مناسب را در فایل build.gradle برنامه خود قرار دهید. برای به‌روزترین وابستگی‌های اتاق به «تنظیم» مراجعه کنید.

کلاس های مدل را به موجودیت های داده به روز کنید

Room از موجودیت های داده برای نمایش جداول در پایگاه داده استفاده می کند. هر کلاس موجودیت یک جدول را نشان می دهد و دارای فیلدهایی است که ستون های آن جدول را نشان می دهد. این مراحل را دنبال کنید تا کلاس‌های مدل موجود خود را به‌عنوان موجودیت‌های اتاق به‌روزرسانی کنید:

  1. اعلان کلاس را با @Entity حاشیه نویسی کنید تا نشان دهید که یک موجودیت Room است. شما می توانید به صورت اختیاری از ویژگی tableName برای نشان دادن اینکه جدول به دست آمده باید نامی متفاوت از نام کلاس داشته باشد استفاده کنید.
  2. فیلد کلید اصلی را با @PrimaryKey حاشیه نویسی کنید.
  3. اگر هر یک از ستون‌های جدول به‌دست‌آمده باید نامی متفاوت با نام فیلد مربوطه داشته باشد، آن قسمت را با @ColumnInfo حاشیه‌نویسی کنید و ویژگی name روی نام ستون درست تنظیم کنید.
  4. اگر کلاس دارای فیلدهایی است که نمی خواهید در پایگاه داده باقی بمانند، آن فیلدها را با @Ignore حاشیه نویسی کنید تا نشان دهید که Room نباید برای آنها در جدول مربوطه ستون ایجاد کند.
  5. اگر کلاس بیش از یک متد سازنده دارد، با حاشیه نویسی تمام سازنده های دیگر با @Ignore ، مشخص کنید که اتاق سازنده از کدام سازنده استفاده کند.

کاتلین

@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?,
)

جاوا

@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

Room از اشیاء دسترسی به داده (DAO) برای تعریف روش هایی که به پایگاه داده دسترسی دارند استفاده می کند. دستورالعمل دسترسی به داده ها با استفاده از اتاق DAO را دنبال کنید تا روش های جستجوی موجود خود را با DAO جایگزین کنید.

یک کلاس پایگاه داده ایجاد کنید

پیاده سازی های Room از کلاس پایگاه داده برای مدیریت نمونه ای از پایگاه داده استفاده می کنند. کلاس پایگاه داده شما باید RoomDatabase گسترش دهد و به همه موجودیت ها و DAO هایی که تعریف کرده اید ارجاع دهد.

کاتلین

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

جاوا

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

مسیر مهاجرت را تعریف کنید

از آنجایی که شماره نسخه پایگاه داده در حال تغییر است، باید یک شی Migration برای نشان دادن مسیر مهاجرت تعریف کنید تا Room داده های موجود را در پایگاه داده نگه دارد. تا زمانی که طرح پایگاه داده تغییر نکند، این می تواند یک پیاده سازی خالی باشد.

کاتلین

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

جاوا

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 برای ایجاد نمونه ای از پایگاه داده خود با مسیر مهاجرت استفاده کنید:

کاتلین

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

جاوا

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

اجرای خود را تست کنید

مطمئن شوید که اجرای اتاق جدید خود را آزمایش کرده اید:

  • برای آزمایش مهاجرت پایگاه داده خود، راهنمایی های موجود در Test migrations را دنبال کنید.
  • برای آزمایش روش‌های DAO، دستورالعمل‌های موجود در Test your database را دنبال کنید.

مهاجرت تدریجی

اگر برنامه شما از یک پایگاه داده بزرگ و پیچیده استفاده می کند، ممکن است امکان انتقال برنامه به یکباره به اتاق وجود نداشته باشد. در عوض، می‌توانید به‌صورت اختیاری موجودیت‌های داده و پایگاه داده اتاق را به عنوان اولین قدم پیاده‌سازی کنید و سپس روش‌های پرس‌وجو خود را بعداً به DAO منتقل کنید. شما می توانید این کار را با جایگزین کردن کلاس کمکی پایگاه داده سفارشی خود با شی SupportSQLiteOpenHelper که از RoomDatabase.getOpenHelper() دریافت می کنید، انجام دهید.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد مهاجرت از SQLite به Room، به منابع اضافی زیر مراجعه کنید:

وبلاگ ها