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

AbdulAlim Rajjoubمنذ سنة

 قواعد البيانات أحد أهم الأشياء الذي يجب عليك تعلمها في مشوار طريقك لتعلم البرمجة,لأي لغة كانت وليس فقط الأندرويد. في هذا الدرس سنشرح عن قواعد البيانات المحلية "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) سأضع لك هذا السطر اذا أردت استخدامه بسرعة (مع العلم أنه يفضل استخدام أحدث إصدار في حال توفره)

Realm1.png.b239115325be3b7e256b62341682b9bc.png  

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

   Realm2.png.b750f00dd9d5579f00c41c1ed2b065ce.png  

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

Realm3.png.cb1e4204142c7f0958fd03ba01dab4f9.png

 

Realm4.png.bdb65d30d19faba76e9e4f6df4331ca1.png

 

apply plugin: 'realm-android'

 

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

 

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

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

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

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

Realm5.png.0414caafd492d6df76886bcfb2542dd7.png  

 

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

 

Realm6.png.8567a5e3bbd06291a2abed7b4b2e8f42.png

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

Realm8.png.f49f405e11b53b8ea39123a409fec5a1.png  

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

Realm7.png.0d008660c0319f3f73578a68c53f8e30.png

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

 

Realm9.png.d1ddde6cc89a048e84eceabf74adb227.png

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

Realm10.png.0fb87f2484fa90f8a104618ce5edbc28.png

ثم نقوم بتعريف زر 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();

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

Realm11.png.0d7374fbb944fc1482007f28fec52e62.png  

عند الضغط على زر حفظ من المفروض أنه قد تم حفظ الملاحظة ..

ننتقل الآن الى عرض هذه الملاحظات ,سنعرضها في RecyclerView ولن أشرح طريقة عمل RecyclerView وإنشاء Adapter يمكنك مراجعتها في هذا الدرس نقوم بإنشاء RealmResults<Note> وهي عبارة عن List تحتوي على البيانات المخزنة في Realm ثم نقوم بإعطاء هذه الليست ل adapter ليعرضها في Recycler View

Realm12.png.ae6df5b73d23bf4f37d58c592ee45c14.png

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

adapter.notifyDataSetChanged();

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

Realm13.png.f11196f472d6d31940a942b1fe7e8cb6.png

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

Realm14.png.6e78aa96ff03e4b2517b4b9988364ce3.png

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

Realm15.png.18a8f91a81e69c10e21456a31c384856.png

 

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

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

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

 

Realm16.png.0fdf5cb6072bb2b9b7c626a1f205aa5c.png

نذهب الى كلاس 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 وهكذا..

 

Realm17.png.2258b809c0962bb2bd5575d8bf765f00.png

 

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

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

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

Realm18.png.832a4e8f33df7cebf16171b100599b81.png

 

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

 

Realm19.png.a4e3cca89878dfb9a10ea3cff163302d.png

 

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

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

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

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

 

Realm20.png.d0e7cc6af6f38e293ce219054d417fb3.png

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

 

Realm21.png.15eb510b03435f93216e7aafd141f021.png

 

ملاحظة

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

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

Realm9999.png.52afc445a926dac05136465519ec504c.png

وداخلها نقوم بوضع الإعدادات ل 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"

Realm99999.png.55a72fb123dfd44f650245fb805dd721.png

 

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

 

Realm999.png.4d156cbcfde9be1d8f4400fe3d2f7907.png

 

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

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

1
إعجاب
1413
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !