استخدام الـ Paging في الـ DAO

Mohammad Laifمنذ سنة

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

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

 

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

  • ماهي الـ Paging.
  • ماهي فوائد الـ Paging.
  • كيف تعمل الـ paging.

 

ماهي الـ Paging؟

https://www.youtube.com/watch?v=QVMqCRs0BNA

عبارة عن مكتبة كالاخريات من Android Jetpack تسهل لك التعامل مع البيانات المراد عرضها في الـ RecyclerView بسلاسه. وتزيد من كفائة التطبيق وذلك بتحميل جزء قليل من البيانات بدلاً من تحميل جميع البيانات في مره واحده.

 

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

  • تقلل من حجم استهلاك الشبكة (لانها ستقوم بتحميل فقط مايحتاجة المستخدم من بيانات).
  • التطبيق سيعمل بسلاسه وبعيداً عن البطئ عند تحميل البيانات من الشبكة او حتى من قاعدة البيانات.

 

كيف تعمل الـ Paging؟

paging
المصدر Google Code Labs Developer

عندما يقوم المستخدم بتشغيل التطبيق وهو خالي من البيانات تقوم الـ PageList من خلال الادابتر PagedListAdapter بإرسال امر الى الـ DataSource وبدورها تقوم بتحميل وحفظ البيانات من الـ Cloud الى قاعدة البيانات. ثم تقوم الـ LiveData بنقل هذه البيانات من قاعدة البيانات الى الـ ViewModel ومن ثم الى UI من خلال الـ PagedListAdapter وتتمثل للمستخدم في الـ RecyclerView.

و عندما يقوم المستخدم بتحريك الـ RecyclerView الى الاسفل لعرض المزيد من العناصر, تقوم الـ PagedList مره اخرى من خلال الادابتر pagedListAdapter بإرسال امر الى الـ DataSource. ويقوم الـ DataSource باستخدام الـ DataSource.Factory والذي بدوره ينبه قاعدة البيانات بالمطلوب, ومن ثم تقوم قاعدة البيانات بتغليف البيانات المطلوبه في LiveData وتمررها الى الـ ViewModel وبدورها ترسلها الى الـ UI. 
 

ماذا سننشئ؟

  • في هذا الدرس سنقوم فقط بالتعديل على الواجهه التي انشئناها سابقاً وهي CardDao حتى نجعل بعض من دوالها تقوم بارجاع قوائم Paging حتى نستطيع تطبيق الـ Paging بشكل كامل بالدروس القادمة (بعد انشاء الـ Repopsitory و  ViewModel).

 

لدينا دالتين في الواجهه السابقة SubjectDao وهما:

  1. دالة getAllCard تقوم بأرجاع قائمة من كل عناصر الـ CardEntity الموجودة بقاعدة البيانات.
  2. دالة getCardsByParentId تقوم بارجاع قائمة بعناصر محدد باستخدام id من الـ CardEntity.
@Query("SELECT * FROM cards ")
<List<CardEntity>> getAllCard();

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

 

والان سنقوم بعمل Wrapper لهم باستخدام الـ Paging كالتالي:

@Query("SELECT * FROM cards ")
DataSource.Factory<Integer, CardEntity> getAllCard();

@Query("SELECT * FROM cards WHERE card_parent_id = :id")
DataSource.Factory<Integer, CardEntity> getCardsByParentId(int id);

لاحظ الفرق البسيط في اننا فقط قمنا بتغليفهم بالـ DataSource واستخدمنا الـ Factory الموجود مسبقاً مع هذه مكتبة الـ Paging.

 

لتصبح الواجهه الكامله على النحو التالي:

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 {

    // Using Paging
    @Query("SELECT * FROM cards ")
    DataSource.Factory<Integer, CardEntity> getAllCard();
    // Using Paging
    @Query("SELECT * FROM cards WHERE card_parent_id = :id")
    DataSource.Factory<Integer, CardEntity> getCardsByParentId(int id);

    @Query("SELECT * FROM cards WHERE card_id = :id")
    CardEntity getCardById(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();

}

وهكذا صنعنا Dao متوافقه مع الـ Paging وسوف نستخدمها لاحقاً في الدروس المستقبليه.

 

نهاية الدرس

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

 

المصادر:

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

Ali Mohamed Radwan:

ليه احنا مستخدمناش ال live Data هنا ؟ وليه بردو مستخدمناش ال paging مه ال Subject Dao ؟

Mohammad Laif:

اهلاً اخي بالنسبة لتساؤلاتك:

ليه احنا مستخدمناش ال live Data هنا ؟

تبقى خطوة واحدة حتى نستطيع استخدام الـ Paging مع الـ LiveData وهي عملية بناء هذه القائمة اللتي تسمى بالـ Paging ثم نغلفها بداخل LiveData. قمنا بعمل هذه الخطوة بإستخدام الـ LiveData مع الـ Paging بواسطة نمط الـ Repository في درس متقدم بعنوان: انشاء المستودع بـ Paging هكذا:

    public LiveData<PagedList<CardEntity>> getAllCardsById(int id) {
        // Configuration for our Paging
        PagedList.Config pagedListConfig = (new PagedList.Config.Builder())
                .setEnablePlaceholders(true)
                .setPrefetchDistance(10)
                .setPageSize(20)
                .build();

        LiveData<PagedList<CardEntity>> cardsById = (new LivePagedListBuilder(mCardDao.getCardsByParentId(id), pagedListConfig)).build();

        return cardsById;
    }

تلاحظ ان الدالة تقوم بإرجاع عناصر Card مغلفين بالـ Paging ثم بالـ LiveData.

 

وليه بردو مستخدمناش ال paging مه ال Subject Dao ؟

انت حر اذا كنت تريد استخدام الـ Paging او لا.

في مثالنا هذا: ملف الـ Subject عناصره قليله بالعادة, اي انه لن يحدث لنا بطئ عندما نريد عرضهم في الـ RecyclerView. بينما عناصر الـ Card كثيرة جداً بالالف, وربما تسبب لنا بطئ عندما نريد عرضهم في الـ ReyclerView لذلك استخدمنا معهم تقنية الـ Paging حتى نحدد الكمية التي نريد الحصول عليها من مصدر البيانات (سواء من قاعدة البيانات او من الانترنت) مثلاً انت لاتريد من المستخدم ان يقوم بتحميل ١٠٠٠٠٠ عنصر لـ RecyclerView ثم يتصفح فقط ٢٠ عنصر ويغلق التطبيق! هذا يعتبر اضاعة للموارد (تكاليف ماليه ربما يتصل بالانترنت, تكاليف في استخدام الذاكرة وقوة المعالج وما الى ذلك). بل تريد من المستخدم كلما عمل Scroll في الـ RecyclerView ان يتم تحميل ٢٠ عنصر و تجهيز ١٠ عنصر. وهذه هي فائدة الـ Paging.

 

Ali Mohamed Radwan:

شكرا .. كدا الامر وضح جدا 

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

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