Migration در Android Architecture Components: Room

یکشنبه ۰۲ اردیبهشت ۹۷ توسط یوسف رضا مختاری

سلام ! این چهارمین مقاله در مجموعه مقالات Architecture Components articles می باشد.

امروز میخواهم درباره migration در پایگاه داده Room  با شما صحبت کنیم .اگر شما مقاله های قبلی را نخواندید میتوانید از لینک های زیر استفاده کنید .

معرفی Android Architecture Components: Room 

بررسی روابط در Android Architecture Components: Room

Custom Type در Android Architecture Components: Room

در هر صورت پیشنهاد میکنم پست امروز را بخوانید . بیایید شروع کنیم .

Migration

گاهی اوقات لازم است که schema یا طرح پایگاه داده موجود را تغییر دهید .

اگر ما بعضی از فیلد ها را در پایگاه داده اضافه , حذف یا بروزرسانی کنیم و سپس برنامه را اجرا کنیم , ما به exception از طرف Room برمیخوریم :

java.lang.IllegalStateException: Room cannot verify the data integrity.
Looks like you’ve changed schema but forgot to update the version number.
You can simply fix this by increasing the version number.

Room میابد که این schema یا طرح تغییر یافته و با نسخه پایگاه داده سازگار نمی باشد .

حالا اگر ما شماره ورژن را افزایش دهیم و یک بار دیگر برنامه را اجرا کنیم , به یک exception دیگر برخواهیم خورد :

java.lang.IllegalStateException: A migration from 1 to 2 is
necessary.Please provide a Migration in the builder or call
fallbackToDestructiveMigration in the builder in which case Room
will re-create all of the tables.

در حال حاضر Room نمیداند چگونه پایگاه داده از نسخه 1 به نسخه 2 migrate (مهاجرت) کند .

در این خطای Room دو راه حل پیشنهاد شده :

  • Drop و دوباره ساختن کل پایگاه داده .
  • طرح (schema) پایگاه داده را به نسخه جدیدتر Upgrade کنیم .

اولین گزینه ساده ترین راه می باشد اما این بهترین راه برای کاربران نیس زیرا کل پایگاه داده را پاک میکنیم . . .

با وجود اینکه من این راه حل را پیشنهاد نمی کنم , این راه حل با Room امکان پذیر می باشد .

 برای انجام این کار ما باید یک خط را به سازنده (builder) پایگاه داده اضافه کنیم :

Room.databaseBuilder(context, RepoDatabase.class, DB_NAME)
    .fallbackToDestructiveMigration()
    .build();

اما اگر بخواهیم اپلیکیشن ما کاربر پسند تر باشد , ما میتوانیم از migration در پایگاه داده مان استفاده کنیم .

این کار با Room بسیار آسان است . برای انجام این کار ما باید migration را در سازنده پایگاه داده مشخص کنیم .

Room.databaseBuilder(context, RepoDatabase.class, DB_NAME)
    .addMigrations(FROM_1_TO_2)
    .build();

static final Migration FROM_1_TO_2 = new Migration(1, 2) {
    @Override
    public void migrate(final SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE Repo 
                         ADD COLUMN createdAt TEXT");
        }
    };

برای ایجاد یک migration ما به object  یا شی Migration به سادگی شماره های نسخه و دستورات SQL را پاس میدهیم.

در حال حاضر , بزرگترین مزیت Room , تولید خودکار دستورات SQL میباشد.

متاسفانه چیزی که در migration  پایگاه داده میتواند ما را دچار مشکل کند این است که ما دستورات مناسبی نداریم .

 خوشبختانه راه حلی برای این کار وجود دارد:

android {
   defaultConfig {
     javaCompileOptions {
       annotationProcessorOptions {
         arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
       }
     }
   }
 }

این قطعه کد را به فایل build.gradle اضافه می کنیم. ما قادر خواهیم بود دستورات خودکار SQL کتابخانه Room را دریافت کنیم و از آنها برای ساختن migration استفاده کنیم .

"tableName": "Repo",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, PRIMARY KEY(`id`))"

فایل ها در directory زیر قرار دارند:

/app/schemas/your.package.name.RepoDatabase

 

امیدوارم این مطلب برای شما مفید بوده باشد.

 

 

 
 

کلیدواژه: آموزش برنامه نویسی اندروید آموزش دیتابیس Room Room اندروید Android Architecture Components Migration در دیتابیس room

منابع: android.jlelse.eu

دیدگاه ها:
مهدی رضائی
۹ ماه قبل
reply
آموزشهاتون خیلی عالی هست فقط موندم اون خانم واسه چی داره وسط آموزش میرقصه!!!!؟ اون فایل گیف واسه چی وسط آموزش گذاشتین؟! خخخخ
یوسف رضا مختاری
۹ ماه قبل در پاسخ به مهدی رضائی
reply
تشکر...اولین گزینه ساده ترین راه می باشد اما این بهترین راه برای کاربران نیس زیرا کل پایگاه داده را پاک میکنیم . . . اون خانوم اهمیتی براش نداره که کل پایگاه داده پاک باشه... جنبه فان قضیه هس.
ارسال دیدگاه:
برای ارسال دیگاه باید به سیستم وارد شوید و یا ثبت نام کنید. ثبت نام چند لحظه بیشتر زمان شما را نمیگیرد.