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 الامر يرجع اليك
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 كما يظهر بالصورة .
الان ارجع الى activity_main وقم بعمل تصميم بسيط جدا ( اتوقع كل هذا تم شرحة سابقا عموما اليوم سوف نشرح لكم زر الاضافة والحصول على المعلومات )
الان انتقل الى 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) {
}
});
}
});
لا تسنى تعريف المتغيرات كما بالصورة التالية واذا كنت قمت باتباع خطوات المقالة السابقة ف اعتقد انك لست بحاجة هذا .
كيفية عمل get للبيانات من room
ببساطة نفس الخطوات السابقة وهو setOnClickListener وبدلا من تقوم بعمل insert للبيانات من noteDAO قم بعمل getnote وهذة عبارة عن referance وقم باكمال الكود كما شرحت لكم بالاعلى ولكن تذكر ان استقبال الداتا كان single لذلك سوف تجعله SingleObserver وداخل onSuccess سوف تقوم بعمل adapter.setPostsList(posts); و adapter.notifyDataSetChanged(); وهي ببساطة انك تنادي على الadapter وتستدعي setPostsList التي تم استدعائها بالاعلى وترسل لها posts وبالنسبة للامر الثاني فهو يخبر الادبتر بالذي يحصل
كود الحصول على البيانات في 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 بسطر واحد فقط وسوف تعمل على عرض كل ما تريد .
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 فقط
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);
}
});
لمزيد من المقالات يمكنك مشاهدة باقي المقالات على الموقع .