شرح استخدام الـ Room في اضافة وتخزين البيانات في برنامج اندرويد ستوديو

 

شرح استخدام الـ Room في اضافة وتخزين البيانات في برنامج اندرويد ستوديو

android studio local data base #7 : شرح استخدام الـ Room في اضافة وتخزين البيانات


ما زلنا مستمرين معكم في سلسلة Room database android شرح حيث تعد الـ Room مكتبة من اهم المكتبات التي تم توفرها في Android Jetpack في الفترات الاخيرة تقوم هذة المكتبة بعملية انشاء قواعد بيانات SQLite يتم استخدامها بشكل اسرع للحصول على البيانات وتخزين بها بيانات وايضا لعمل cache لتطبيقك عندما تكون لديك data قادمه لك من الانترنت او من api  وفي هذة السلسلة نكمل معكم الحديث عنها ونحاول تغطية كل شيئ حولها لكم في هذا القسم Room database .


اذا لم تكن تعرف room وطريقة استخدامها فهي كما ذكرت لك انها طريقة لتخزين بياناتك سواء كانت البيانات بشكل online من firebase او api يمكنك تخزينها او تخزين بيانات من جهازك , وفي هذة السلسلة سنقوم بعمل شرح مفصل لـ room بشكل مبسط واذا لم تفهم الفكرة بشكل جيد يمكنك الرجوع الى مقالة Android Introduction To Rom حيث شرحنا لكم كيف تعمل وما تحتاجه لتعمل وكل شيئ عنها تقريبا وايضا نحاول في الدروس التي نقدمها ان نغطي الموضوع بشكل كافي لكم .


كيفية عمل Insert 


هذا الدرس سوف نتعرف على كيفية اضافة بيانات والحصول عليها في اندرويد ستوديو في الدرس السابق قمنا بعمل تطبيق بسيط جدا يقوم المستخدم بإدخال بيانات ويتم حفظها وفي هذا الدرس سوف نشرح الطريقة بشكل ابسط وبهدوء لكي تفهموها بشكل اوضح سوف اول شيئ انتقل الى NoteDAO وقم بعمل Completable للInsert و Single للget ويمكنك عمله لها Completable ايضا بدلا من Single الامر يرجع اليك 


كيفية عمل Insert

NoteDAO.interface


    @Insert
    Completable insertNote (NoteEntity note);

    @Query("Select * from NoteTable")
    Single <List<NoteEntity>> getnote ();

    public void setPostsList(List<NoteEntity> postsList) {
        this.postsList = postsList;
        notifyDataSetChanged();
    }
    


الخطوة التالية هي التاكد انك قمت بعمل setPostsList وقم بعمل به notifyDataSetChanged في كلاس RecyclerAdapter كما يظهر بالصورة .


شرح استخدام الـ Room في اضافة وتخزين البيانات في برنامج اندرويد ستوديو

الان ارجع الى activity_main وقم بعمل تصميم بسيط جدا ( اتوقع كل هذا تم شرحة سابقا عموما اليوم سوف نشرح لكم زر الاضافة والحصول على المعلومات )


شرح استخدام الـ Room في اضافة وتخزين البيانات في برنامج اندرويد ستوديو

الان انتقل الى MainActivity وقم بتعريف الازرار وبعدها قم بعمل setOnClickListener للزر وبعدها قم بتمرير database.noteDAO().insertNote بداخلة كما يظهر بالكود , ببساطة هو انك تقوم بمناداة database التي تحميل البيانات وتخربها ان تنتقل الى noteDAO وتحضر لك البيانات من insertNote بعدها قمت بكتابة Edittext وجعل المتستخدم من يدخل البيانات بعدها قمت بعمل اشتراك في Schedulers.computation عن طريق subscribeOn هذا لاني استخدم rx java في طبيعة بعدها اجعل observeOn يشترك في AndroidSchedulers بعدها subscribe واكمل الكود , ملاحظه اذا لم تكن تريد كتابة subscribeOn وما بعدة قم بالانتقال الى NoteDAO.interface ومن ثم قم بتغيير Completable الى void كما كانت موجوده في الاول .


MainActivity.class 


        insertBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

    database.noteDAO().insertNote(new NoteEntity(Objects.requireNonNull(noteTitle.getEditableText()).toString(), bodyEt.getEditableText().toString()))
                        .subscribeOn(Schedulers.computation())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new CompletableObserver() {
                            @Override
                            public void onSubscribe(Disposable d) {
                            }
                            @Override
                            public void onComplete() {
                             adapter.notifyDataSetChanged();
                            }
                            @Override
                            public void onError(Throwable e) {
                            }
                        });
            }
        });
        


لا تسنى تعريف المتغيرات كما بالصورة التالية واذا كنت قمت باتباع خطوات المقالة السابقة ف اعتقد انك لست بحاجة هذا .


شرح استخدام الـ Room في اضافة وتخزين البيانات في برنامج اندرويد ستوديو

كيفية عمل get للبيانات من room


ببساطة نفس الخطوات السابقة وهو setOnClickListener وبدلا من تقوم بعمل insert للبيانات من noteDAO قم بعمل getnote وهذة عبارة عن referance وقم باكمال الكود كما شرحت لكم بالاعلى ولكن تذكر ان استقبال الداتا كان single لذلك سوف تجعله SingleObserver وداخل onSuccess سوف تقوم بعمل  adapter.setPostsList(posts); و adapter.notifyDataSetChanged(); وهي ببساطة انك تنادي على الadapter وتستدعي setPostsList التي تم استدعائها بالاعلى وترسل لها posts وبالنسبة للامر الثاني فهو يخبر الادبتر بالذي يحصل 


كيفية عمل get للبيانات من room

كود الحصول على البيانات في android studio باستخدام room


        getBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                database.noteDAO().getnote()
                        .subscribeOn(Schedulers.computation())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new SingleObserver<List<NoteEntity>>() {
                            @Override
                            public void onSubscribe(Disposable d) {
                            }
                            @Override
                            public void onSuccess(List<NoteEntity> posts) {
                                adapter.setPostsList(posts);
                                adapter.notifyDataSetChanged();
                                Log.i(TAG, "onSuccess: " + posts);
                            }

                            @Override
                            public void onError(Throwable e) {
                            }
                        });
            }
        });
        


كيف تقوم بعمل insert و get في نفس الوقت ؟


ببساطة يوجد طريقتين واحده من خلال كلاس adapter والاخر يمكنك عمل methode وتضع فيها ما تم ارساله في getBtn.setOnClickListener وتستدعي الفانكشن هذة في الزر ولكن قبل ان تستدعيها يجب ان ترسل فيها الادبتر لكي تستقبله وتعمل عليه وكل شيئ واحد بالصور ويمكنك عمل استدعاء لهذة الميثود في insert و get بسطر واحد فقط وسوف تعمل على عرض كل ما تريد .


كيف تقوم بعمل insert و get في نفس الوقت ؟

code source to method getdata


    private void getdata(RecyclerAdapter adapter) {
            database.noteDAO().getnote()
                    .subscribeOn(Schedulers.computation())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new SingleObserver<List<NoteEntity>>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                        }

                        @Override
                        public void onSuccess(List<NoteEntity> posts) {
                            adapter.setPostsList(posts);
                            adapter.notifyDataSetChanged();
                        }

                        @Override
                        public void onError(Throwable e) {
                        }
                    });
    }
    


قم الان بعمل لها استدعاء فقط insert و get فقط 


قم الان بعمل لها استدعاء فقط insert و get فقط

code source


insertBtn.setOnClickListener(new View.OnClickListener() {
@Override

public void onClick(View view) {
database.noteDAO().insertNote(new NoteEntity(Objects.requireNonNull(noteTitle.getEditableText()).toString(), bodyEt.getEditableText().toString()))
                        .subscribeOn(Schedulers.computation())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new CompletableObserver() {

                            @Override
                            public void onSubscribe(Disposable d) {
                            }

                            @Override
                            public void onComplete() {
                                getdata(adapter);
                            }
                            @Override
                            public void onError(Throwable e) {
                            }
                        });
            }
        });

        getBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               getdata(adapter);
            }
        });
        


لمزيد من المقالات يمكنك مشاهدة باقي المقالات على الموقع .

تعليقات