انشاء الـ ViewModel بـ LiveData

Mohammad Laifمنذ 5 سنوات

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

في هذا الدرس سنتعلم كيفية انشاء كلاس ViewModel وبداخلها LiveData حتى نستطيع استخدام قاعدة البيانات Room من الـ Activity.

 

ماهي الـ ViewMode؟

https://www.youtube.com/watch?v=5qlIPTDE274

كلاس الـ ViewModel صممت لحفظ وادارة البيانات المتعلقه بالـ UI. ولها ادراك بالـ lifeCycle للـ Context (مثل: onResume و onPause الخ..).

 

ماذا سننشئ؟

  • كلاس ViewModel للـ SubjectActivity.

 

انشاء كلاس الـ ViewModel

ننشئ كلاس جديدة ولنسميها SubjectListViewModel ونجعلها تعمل Extends للكلاس AndroidViewModel (في حالة عمل Extends للـ ViewModel فانك لاستطيع انشاء Paramters في الـ Constructor) فهذه الكلاس سوف نقوم باستخدامها لاحقاً في الـ Activity الذي تحتوي على RecyclerView وتعرض للمستخدم عناصر Subjects. ثم نقوم بانشاء حقلين بها الاول للـ Repository الخاص بعناصر الـ Subject, والحقل الثاني عبارة عن LiveData لعناصر الـ Subject:

public class SubjectListViewModel extends AndroidViewModel {
    private SubjectRepository mRepository;
    private LiveData<List<SubjectEntity>> mAllSubjects;
}

 

نقوم بانشاء Constructor يأخد Application (تستطيع جعله يأخد AppDatabase اذا احببت) من خلاله نقوم بعمل init لكل من حقولنا السابقه:

    public SubjectListViewModel(@NonNull Application application) {
        super(application);
        mRepository = SubjectRepository.getInstance(application);
        mAllSubjects = mRepository.getAllSubjects();
    }

 

واخيراً نقوم بكتابة دوال التعامل مع البيانات ومعالجتهم كـ insert و update و delete و query. ملاحظة مهمة هنا الـ ViewModel ستقوم بعمل Delegate الى الـ Repository والذي هو بدوره يقوم ايضاً بعمل Delegate الى الـ Dao ومن ثم الـ Dao تاتي لنا بالبيانات من قاعدة البيانات الـ Room:

    public LiveData<List<SubjectEntity>> getAllSubjects() {
        return mAllSubjects;
    }

    public void getSubjectById(int subjectId) {
        mRepository.getSubjectById(subjectId);
    }

    public void insert(SubjectEntity subjectEntity) {
        mRepository.insert(subjectEntity);
    }

    public void update(SubjectEntity subjectEntity) {
        mRepository.update(subjectEntity);
    }

    public void delete(SubjectEntity subjectEntity) {
        mRepository.delete(subjectEntity);
    }

    public void deleteAll(SubjectEntity subjectEntity) {
        mRepository.deleteAll();
    }

 

وتصبح الكلاس كاملة على الشكل التالي:

package com.mzdhr.flashcards.viewmodel;

import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.LiveData;
import android.support.annotation.NonNull;

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

import java.util.List;

public class SubjectListViewModel extends AndroidViewModel {
    private SubjectRepository mRepository;
    private LiveData<List<SubjectEntity>> mAllSubjects;

    public SubjectListViewModel(@NonNull Application application) {
        super(application);
        mRepository = SubjectRepository.getInstance(application);
        mAllSubjects = mRepository.getAllSubjects();
    }

    public LiveData<List<SubjectEntity>> getAllSubjects() {
        return mAllSubjects;
    }

    public void getSubjectById(int subjectId) {
        mRepository.getSubjectById(subjectId);
    }

    public void insert(SubjectEntity subjectEntity) {
        mRepository.insert(subjectEntity);
    }

    public void update(SubjectEntity subjectEntity) {
        mRepository.update(subjectEntity);
    }

    public void delete(SubjectEntity subjectEntity) {
        mRepository.delete(subjectEntity);
    }

    public void deleteAll(SubjectEntity subjectEntity) {
        mRepository.deleteAll();
    }
    
}

تخيل لو اننا لم نقم بعمل Delegate و Encapsulating لكل تلك الاكواد في الدروس السابقه, فستكون هذه الكلاس كثيرة الاسطر ويصعب ايجاد حلول المشاكل المتعلقه بها.

 

نهاية الدرس

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

 

المصادر:

ViewModel Overview.

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

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

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