قواعد البيانات المحلية باستخدام Realm
قواعد البيانات أحد أهم الأشياء الذي يجب عليك تعلمها في مشوار طريقك لتعلم البرمجة,لأي لغة كانت وليس فقط الأندرويد. في هذا الدرس سنشرح عن قواعد البيانات المحلية "Local Database" وتحديداً باستخدام Realm بدلاً من SQLite
ماهي Realm؟
هي قاعدة بيانات تسهل عليك العمل وتدعم الكثير من الميزات ك Query و ChangeListener وبالتأكيد الحذف والإدخال والتعديل الخ.. وأعتبرها أسهل من SQLite وأستخدمها شخصياً في معظم تطبيقاتي..
Realm مبنية باستخدام لغة C وهي قاعدة بيانات من نوع NoSql ويوجد منها إصدار ل IOS أيضاً كما أنهاتعتبر أسرع بكثير من SQLite وتستخدمها الشركات الكبيرة مثل Twitter,Google,amazon وغيرها..
إضافة 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
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !