انشاء واجهة الـ DAO

Mohammad Laifمنذ 5 سنوات

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

في هذا الدرس سنتعلم كيفية انشاء واجهة interface DAO حتى نهيئ المشروع لإنشاء قاعدة بيانات الـ Room.

 

ماذا سوف تقرئ في هذا الدرس؟

  • ماهي الـ DAO.
  • ماهي فوائد الـ DAO.
  • طريقة انشاء واجهات الـ DAO.

 

ماهي الـ DAO؟

اختصاراً لـ Data Access Objects وهي عباره عن interface (او abstract class عند الحاجة) ننشئها لكل كلاس Entity لدينا (الكلاسات بالدرس السابق). وتكمن وظيفتها باننا من خلالها نستطيع ارسال اوامر SQL الى قاعدة البيانات الـ Room. فسوف نقوم بكتابة جميع الدوال التي سنتعامل مع قاعدة البيانات كالـ Insert و Update و Delete و Query بها.

 

ماهي فوائد الـ DAO؟

  • التخلص من كتابة الاكواد الكثيرة.
  • التحقق سيكون Compile Time اي انك سوف تكتشف الاخطاء بشكل اسرع وبدون تشغيل التطبيق.
  • سهولة كتابة الاختبارات.

 

ماذا سننشئ؟

سننشئ في هذا الدرس واجهتين من نوع DAO تحتوي على اوامر SQL ودوال جافا:

  • SubjectDao.
  • CardDao.

 

انشاء واجهة الـ SubjectDao

ننشئ interface باسم SubjectDao ونقوم بتعليمها بالنوتيشن Dao.

 

عمليات الاستعلام:

نقوم بكتابة دالة ترجع لنا List بعنصر الـ Subject هكذا:

List<Subject> getAllSubject();

ثم نقوم بتعليمها فوقها بالنوتيشن Query ونضع كخيار في داخله امر الـ Sqlite:

@Query("SELECT * FROM subjects")

لتصبح بشكل كامل هكذا:

List<Subject> getAllSubject();
@Query("SELECT * FROM subjects")

 

ماذا لو احتجنا الى ارجاع عنصر واحد فقط؟ اي الاستعلام برقم الـ id لعنصر؟ فسيكون الوضع هكذا:

@Query("SELECT * FROM subjects WHERE subject_id = :id")
Subject getSubjectById(int id);

لاحظ العلاقة بين الـ id في الدالة وفي النوتيشن وطريقة كتابته حتى يتم الربط بينهم.

 

عمليات الحفظ:

نقوم بكتابة دالة تاخد عنصر Subject ولا ترجع شئ, ثم نعلمها بالنوتيشن Insert كالتالي:

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertSubject(SubjectEntity subjectEntity);

لاحظ اننا استخدمنا الخيار onConflict بالقيمة OnConflictStrategy.REPLACE والتي تعني اذا وجد اي تشابه بين قيمه مدخله حديثه وقيمه مخزنه قديمه فقم باستبدالها بالجديدة.

 

عمليات التحديث:

كالسابقة ولكن الاختلاف فقط النوتيشن Update:

@Update(onConflict = OnConflictStrategy.REPLACE)
void updateSubject(SubjectEntity subjectEntity);

 

عمليات الحذف:

نكتب دالة تأخد عنصر Subject ولاترجع شئ, ومعلمه بالنوتيشن Delete:

@Delete
void deleteSubject(SubjectEntity subjectEntity);

ومثال اخر لاستخدام النوتيشن Query ولكن هنا استخدمناه لكتابة داله تقوم بحذف كل البيانات في جدول الـ Subjects:

@Query("DELETE FROM subjects")
void deleteAll();

راجع المصادر لترى طرق اكثر تعمقاً لكتابة هذه الدوال.

 

لتصبح الواجهه للـ SubjectDao كالتالي:

package com.mzdhr.flashcards.database.dao;

import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.OnConflictStrategy;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;

import com.mzdhr.flashcards.database.entity.SubjectEntity;

import java.util.List;

@Dao
public interface SubjectDao {

    @Query("SELECT * FROM subjects")
    List<SubjectEntity> getAllSubject();

    @Query("SELECT * FROM subjects WHERE subject_id = :id")
    SubjectEntity getSubjectById(int id);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertSubject(SubjectEntity subjectEntity);

    @Update(onConflict = OnConflictStrategy.REPLACE)
    void updateSubject(SubjectEntity subjectEntity);

    @Delete
    void deleteSubject(SubjectEntity subjectEntity);

    @Query("DELETE FROM subjects")
    void deleteAll();

}

 

وكذلك الامر بالنسبة لواجهة الـ CardDao:

package com.mzdhr.flashcards.database.dao;

import android.arch.paging.DataSource;
import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.OnConflictStrategy;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;

import com.mzdhr.flashcards.database.entity.CardEntity;

@Dao
public interface CardDao {

    @Query("SELECT * FROM cards ")
    <List<CardEntity>> getAllCard();
 
    @Query("SELECT * FROM cards WHERE card_id = :id")
    CardEntity getCardById(int id);

    @Query("SELECT * FROM cards WHERE card_parent_id = :id")
    <List<CardEntity>> getCardsByParentId(int id);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertCard(CardEntity cardEntity);

    @Update(onConflict = OnConflictStrategy.REPLACE)
    void updateCard(CardEntity cardEntity);

    @Delete
    void deleteCard(CardEntity cardEntity);

    @Query("DELETE FROM cards")
    void deleteAll();

}

لاحظ الدالة getCardsByParentId اللتي تقوم بارجاع سلسلة من عناصر الـ Card التي تحتوي على id معين, وهذه الداله سنستخدمها للإستعلام عن المفتاح الخاص بربط الجداول كما بالدرس السابق. فمثلاً لو عندنا مادة الرياضات ونريد عرض جميع الكروت لهذه المادة في RecyclerView فأننا سنستخدم هذه الدالة.

 

نهاية الدرس

فضلاً اذا اعجبك الدرس لاتنسى الضغظ على زر اعجبني ولنشر الفائدة قم بمشاركته مع من تحب. ولاتنسى تتبع الدرس حتى تطلع على التغييرات والتحديثات المتعلقه به مستقبلاً. وكذلك الامر بالنسبة للدورة من تتبع و اعجاب ومشاركة حتى يصلك جديد الدروس المتعلقه بها.

 

المصادر:

Accessing data using Room DAOs

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

Mukhtar:

شكراً ع المجهود

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

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