قواعد البيانات المحلية باستخدام Realm

قواعد البيانات أحد أهم الأشياء الذي يجب عليك تعلمها في مشوار طريقك لتعلم البرمجة,لأي لغة كانت وليس فقط الأندرويد.
في هذا الدرس سنشرح عن قواعد البيانات المحلية “Local Database” وتحديداً باستخدام Realm بدلاً من SQLite

ماهي Realm؟

هي قاعدة بيانات تسهل عليك العمل وتدعم الكثير من الميزات ك Query و ChangeListener وبالتأكيد الحذف والإدخال والتعديل الخ..
وأعتبرها أسهل من SQLite وأستخدمها شخصياً في معظم تطبيقاتي..

إضافة Realm الى مشروع Android Studio

إضافة Realm الى Android Studio مختلف بعض الشيئ,فهو يستخدم Classpath و plugin..

بعد إنشاء مشروع Android Studio سنذهب الى موقع Realm  ونأخذ سطر Gradle ونضيفه في في مشروعنا في build.Gradle(Project)
سأضع لك هذا السطر اذا أردت استخدامه بسرعة (مع العلم أنه يفضل استخدام أحدث إصدار في حال توفره)



 

classpath "io.realm:realm-gradle-plugin:3.0.0"

 

 

ثم نذهب الى build.Gradle(app) ونضع  سطر ال plugin

apply plugin: 'realm-android'

 

بعد ذلك نضغط على Sync Now لبدء مزامنة Gradle وتحميل Realm

 

بناء تطبيق ملاحظات بسيط

لفهم Realm أكثر سنبدأ بإنشاء تطبيق لحفظ الملاحظات وتعديلها وحذفها

نبدأ بإنشاء كلاس Model ويحتوي على

  • id معرف كل ملاحظة ,سنستخدمه لاحقاً لعرض الملاحظة , تعديلها او حذفها
  • noteTitle  عنوان الملاحظة
  • noteContent محتوى الملاحظة

يجب ان تكون هذه المتغيرات private ,وطبعاً نقوم بإنشاء getters and Setters لهذه المتغيرات

ونجعل الكلاس extends من RealmObject

 

 

نذهب الآن الى MainActivity وننشئ اوبجكت من Realm ونسميه realm

ونضع هذه الأسطر لعمل initialize او تهيئة لبدء استخدام Realm في هذا الكلاس

ونضع FloatingActionButton ,عند الضغط على هذا الزر سيقوم بفتح الأكتفتي AddNoteActivity التي سننشأها الآن

 

نقوم بإنشاء أكتفتي جديد AddNoteActivity وفيه 2EditText ,الأول لعنوان الملاحظة ,والثاني لمحتوى الملاحظة

ونقوم بتعريف Realm كما فعلنا في MainActivity ونقوم بتعريف وربط EditTexts

سنقوم بإنشاء ملف xml من نوع menu ونضع به زر لحفظ الملاحظة (سيظهر في ActionBar)

ونقوم بتعريفه بالكلاس AddNoteActivity باستخدام دالة onCreateOptionsMenu

ثم نقوم بتعريف زر save

MenuItem saveItem = menu.findItem(R.id.save);

الآن عند الضغط على هذا الزر سنبدأ بحفظ الملاحظة الى قاعدة البيانات Realm

نبدأ بإنشاء اوبجكت جديد من Note

 

Note note = new Note();

ثم نضع ال id عبر ميثود getNextKey والتي تقوم بإنشاء id جديد في كل مرة نضيف عنصر جديد

note.setId(getNextKey());

ثم نضع عنوان الملاحظة ومحتواها المكتوبة في editText

note.setNoteTitle(noteTitle.getText().toString());
note.setNoteContent(noteContentEt.getText().toString());

أخيراً نقوم بحفظ هذه note الى realm ولهذا فعلينا بدايةً فتح الإتصال في realm عبر

realm.beginTransaction();

ثم نحفظ note عبر ميثود copyToRealm

realm.copyToRealm(note);

وأخيراً لاننسَ إغلاق الإتصال عند الإنتهاء عبر ميثود commitTransaction

realm.commitTransaction();

نشغل التطبيق ونجرب حفظ ملاحظة جديدة

 

عند الضغط على زر حفظ من المفروض أنه قد تم حفظ الملاحظة ..
ننتقل الآن الى عرض هذه الملاحظات ,سنعرضها في RecyclerView ولن أشرح طريقة عمل RecyclerView وإنشاء Adapter يمكنك مراجعتها في هذا الدرس

نقوم بإنشاء RealmResults<Note> وهي عبارة عن List تحتوي على البيانات المخزنة في Realm

ثم نقوم بإعطاء هذه الليست ل adapter ليعرضها في Recycler View

ثم نقوم بعمل Override ل onResume ونضع

adapter.notifyDataSetChanged();

ليتم تحديث ال RecyclerView عند الإنتهاء من إضافة الملاحظة

نقوم بتشغيل التطبيق مرة أخرى وسنجد الملاحظة الذي قمنا بإدخالها

نقوم بإضافة بعض الملاحظات

ننتقل الى كيفية تعديل الملاحظة وبدلاً من إنشاء أكتفتي لتعديل الملاحظة سنقوم باستخدام نفس الأكتفتي AddNoteActivity

على العموم ننتقل الى NoteAdapter وداخل onBindViewHolder وعند الضغط على الملاحظة سيتم فتح الأكتفتي AddNoteActivity

ونقوم بإرسال id الملاحظة الذي تم الضغط عليها

نذهب الى كلاس AddNoteActivity ونعرف بعض المتغيرات:

  • boolean fromAdapter = false; هذا المتغير لمعرفة هل تم تشغيل هذا الأكتفتي من Adapter (عنصر تم الضغط عليه) أم عن طريق زر FloatingActionButton (إنشاء ملاحظة جديدة)
  • id وهو id الذي تم الضغط عليه
  • results وهي العناصر الموجودة في الداتابيز

ثم بعد ذلك نقوم بالتحقق في onCreate اذا كان intent يوجد معه متغير و key اسمه “id” ؟ عندها قم  بتغيير قيمة fromAdapter الى true و  نقوم بإعطاء قيمة للمتغير id الى id الذي أرسلناه في intent

وقلنا ل Results ابحث عن كافة العناصر في العمود “id” في قاعدة البيانات Realm والتي تساوي قيمتها id الذي أرسلناه في intent

بمعنى اذا كان id 1 فسيجلب العنصر الذي id الخاص به 1 وهكذا..

ثم قمنا بعمل for loop على هذه results ووضعنا عنوان الملاحظة ومحتواها في editText

اما الآن داخل onCreateOptionsMenu سنتحقق اذا كانت fromAdapter = true؟ عندها نقوم بعمل for على Results ونقوم بتغيير عنوان ومحتوى الملاحظة ونحفظها في realm,

else وإلا سنقوم بحفظ الملاحظة كملاحظة جديدة

نشغل التطبيق ونجرب تغيير عنوان الملاحظة من “Tec-Store.org” الى “Cool Website”

نتجه الآن الى عملية الحذف 

سنبدأ بإنشاء زر جديد في Actionbar عند الضغط عليه سيحذف الملاحظة من قاعدة البيانات

ونقوم أيضاً بالتحقق if fromAdapter= true عندها سنفعل هذا الزر

else والا سنقوم بتعطيله (في حالة إنشاء ملاحظة جديدة )

وعند الضغط على هذا الزر سنقوم بحذف العنصر من قاعدة البيانات

ملاحظة

يمكننا بدلاً من تعريف إعدادات Realm في كل كلاس نستعمله يمكننا تعريفه مرة واحدة داخل كلاس  من نوع Application

ولفعل هذا نبدأ بإنشاء هذا الكلاس “MyApp” ونجعله extends Application ونقوم بعمل Override ل onCreate

وداخلها نقوم بوضع الإعدادات ل Realm

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Realm.init(this);
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder().deleteRealmIfMigrationNeeded()
                .build();
        Realm.setDefaultConfiguration(realmConfiguration);
    }
}

ثم نتجه الى AndroidManifest.xml وداخل وسم application نضع

android:name=".MyApp"

وبهذا بدلاً من تعريف نفس الإعدادات في كل كلاس نكتفي فقط بتعريف اوبجكت من Realm

 

 

كل هذا ماكان الا فقط بعض الأساسيات في التعامل مع Realm ولمزيد من المعلومات قم بزيارة الموقع الرسمي

 

يمكنك تحميل هذا المشروع كامل من على Github

 

عن 3llomi

Just A GEEK :)

شاهد أيضاً

إرسال الإشعارات عبر Cloud Functions وبدون سيرفر خارجي

في هذا الشرح سنقوم بطرح كيفية إرسال الإشعارات الى المستخدمين باستخدام Firebase Cloud Functions بدون …

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *