كيفية تنفيذ عمليات الهجرة مع مكتبة استمرار الغرفة

عمليات ترحيل أفضل لقاعدة بيانات الجوال

تصوير ليندسي هينوود على Unsplash

المقدمة

جعلني الترحيل باستخدام قواعد البيانات المحلية في تطبيقات الهاتف المحمول أشعر دائمًا بأنني أبطل مفعول قنبلة. لكن مكتبة الغرفة جعلت التعامل مع عمليات ترحيل قاعدة البيانات أسهل إلى حد ما.

إن قاعدة البيانات المحلية هي شيء تم تصميمه بناءً على منطق العمل الفردي ، وهي مسألة وقت فقط قبل أن تواجه موقفًا حيث يتعين عليك التعامل مع أنواع مختلفة من عمليات الترحيل.

بدلاً من البحث عن حل ، حاول معرفة كيفية عمل عمليات الترحيل في قاعدة بيانات الغرفة بحيث يمكنك قلب المفتاح الصحيح في المكان الصحيح.

باستخدام Room ، إذا قمت بتغيير مخطط قاعدة البيانات أو أضفت جداول جديدة ولم تقم بترقية إصدار قاعدة البيانات ، فسوف يتعطل تطبيقك. إذا قمت بترقية الإصدار ولم تقدم أي قواعد ترحيل ، فسوف يتعطل تطبيقك.

في حالة عدم ملاءمة قواعد الترحيل الصحيحة ، ستنخفض جداول قاعدة البيانات وسيفقد المستخدمون بياناتهم.

أعلم أن هناك الكثير الذي يجب معالجته ، ولكن بمجرد معرفة كيفية عمل الترحيل ، فأنا متأكد من أنك لن تشعر بنفس الطريقة. لذا ، بدون مزيد من اللغط ، لنبدأ.

التاريخ

الغرفة عبارة عن طبقة مجردة فوق قاعدة بيانات SQLite ، مما يعني أن الغرفة يجب أن تتعامل مع SQLite تحت الغطاء.

لذلك ، إذا كنت تعرف كيفية عمل عمليات ترحيل SQLite ، فسوف تفهم سبب حاجتك إلى القيام ببعض الأشياء باستخدام قواعد بيانات الغرفة مثل ترقية الإصدارات وقواعد الترحيل والمزيد والتي ستراها في الأقسام التالية من هذه المقالة.

تعالج قاعدة بيانات SQLite تغييرات المخطط مع إصدارات قاعدة البيانات. لكي تكون أكثر تحديدًا ، يجب عليك زيادة إصدار قاعدة البيانات في كل مرة تقوم فيها بإضافة أو إزالة أو تغيير أي جداول أو مخططات في قاعدة البيانات.

بعد ذلك ، عند فتح التطبيق ، يتعامل SQLite أولاً مع ترحيل الإصدار ، وبعد ذلك فقط ، سيتم فتح قاعدة البيانات.

أشياء إلزامية يجب أن نتعامل معها في الغرفة

دعنا نفكر في مثال بسيط. لدينا قاعدة بيانات مع جدول يسمى الأفلام ذات معرفات الأعمدة الثلاثة (المفتاح الأساسي) ، والاسم والصورة الغلاف مع Int و String و String كنوع بيانات ، على التوالي.

الآن لدينا متطلب جديد لإضافة عمود تصنيف في جدول الأفلام ، لذلك نضيف متغيرًا جديدًا في فئة بيانات الأفلام ، كما هو موضح أدناه.

الحالة 1. رقم الإصدار غير مطور

الآن بعد الانتهاء من التغييرات في قاعدة البيانات وتشغيل التطبيق ، سترى الاستثناء التالي عند محاولة الوصول إلى الغرفة.

java.lang.IllegalStateException: الغرفة لا يمكنها التحقق من سلامة البيانات. يبدو أنك قمت بتغيير المخطط ولكن نسيت تحديث رقم الإصدار. يمكنك ببساطة إصلاح ذلك عن طريق زيادة رقم الإصدار.

هنا ، تحاول الغرفة التحقق من هوية قاعدة البيانات من خلال مقارنة تجزئة هوية الإصدار الحالي مع تلك المحفوظة في room_master_table. ولكن ، لا يوجد تجزئة للهوية ، سوف يتعطل التطبيق مع IllegalStateException.

الآن أنت تعرف سبب التعطل الأول ، دعنا نضعه في قائمة تحقق للتحقق في كل إصدار من التطبيق.

يمكننا حل هذه المشكلة بمجرد ترقية إصدار قاعدة البيانات في فئة قاعدة بيانات التطبيق أو الفئة الموسعة باستخدام RoomDatabase () ، كما هو موضح أدناه.

@ قاعدة البيانات (الكيانات = arrayOf (DashboardCircularCategory :: class ، version = 2)TypeConverters (المحولات :: الفئة) فئة مجردة ApplicationDatabase: RoomDatabase () {

الحالة 2. لم تقدم أي عمليات ترحيل

الآن بعد أن قمنا بترقية إصدار قاعدة البيانات وحاولت الوصول إلى قاعدة البيانات ، سيتعطل التطبيق مع الاستثناء التالي.

java.lang.IllegalStateException: كان الترحيل من 1 إلى 2 مطلوبًا ولكن لم يتم العثور عليه. يُرجى تقديم مسار الترحيل الضروري عبر RoomDatabase.Builder.addMigration (Migration ...) أو السماح بعمليات الترحيل المدمرة عبر إحدى طرق RoomDatabase.Builder.fallbackToDestructiveMigration *.

تحتوي الغرفة على فئة تسمى Migration ، والتي تتعامل مع أي تغييرات في المخطط ؛ وهي مسؤولة عن تشغيل ترقية SQLite. لذلك ، إذا كانت هناك أي تغييرات في المخطط ولم يتم توفير أي عمليات ترحيل ، فسوف يتعطل التطبيق.

الحالة 3. الهجرة المدمرة

الاستثناء نفسه واضح ، نحن بحاجة إلى تنفيذ عمليات الترحيل أو استخدام FallToDestructiveMigration في أداة إنشاء قاعدة بيانات الغرفة. لتبسيط الأمور ، دعنا نستخدم fallbackToDestructiveMigration كما هو موضح أدناه.

Room.databaseBuilder (context.getApplicationContext ()، ApplicationDatabase :: class.java، "applicationDatabase.db") .fallbackToDestructiveMigration () .build ()

لذا الآن ، عندما تحاول الوصول إلى قاعدة بيانات الغرفة ، أثناء ترقية الإصدار ، ستتحقق الغرفة من عمليات الترحيل. لن يعثر على أي منها ، لذلك سوف يتراجع إلى وضع التدمير الذي يسقط جميع الجداول في قاعدة البيانات ثم يدرج تجزئة الهوية.

ونتيجة لذلك ، لن يتعطل التطبيق ، ولكن لا يزال المستخدم يفقد جميع البيانات.

الهجرة مع تغييرات المخطط

لنفترض أن لدينا حالة نحتاج فيها إلى الاحتفاظ بالبيانات وإدخال تغييرات المخطط الجديدة. هذا هو المكان الذي يظهر فيه مفهوم الهجرة الممتاز.

دعونا نرى الأشياء التي يتعين علينا القيام بها خطوة بخطوة.

  1. زيادة إصدار قاعدة البيانات إلى 3.
@ قاعدة البيانات (الكيانات = arrayOf (DashboardCircularCategory :: class ، الإصدار = 2)TypeConverters (المحولات :: الفئة) فئة مجردة ApplicationDatabase: RoomDatabase () 

2. أنشئ ترحيلًا من الإصدار 2 إلى 3 ، بما في ذلك جميع التغييرات التي أجريتها بعد شحن الإصدار 2 إلى الإنتاج.

3. أضف الترحيل إلى أداة إنشاء قاعدة بيانات الغرفة كما هو موضح أدناه.

الآن ، عند محاولة الوصول إلى قاعدة بيانات الغرفة:

  1. سيؤدي ذلك إلى تغيير التغييرات في الجدول.
  2. يقوم بتحديث الهوية.
  3. ثم حاول فتح قاعدة البيانات. نظرًا لأن تجزئة الهوية للإصدار الحالي وحفظها هي نفسها ، فلن تكون هناك أي مشكلة.

علاوة

لمعرفة المزيد حول قاعدة بيانات الغرفة ، اقرأ المقالات التالية.

  • مكتبة ثبات غرفة Android مع Rxjava2 وميزات أقل شهرة من قاعدة بيانات الغرفة
  • مكتبة ثبات غرفة أندرويد - Kotlin Coroutines

شكرا لقرائتك.