لمنع الطلبات من حظر واجهة المستخدم، لا تسمح الغرفة بالوصول إلى قاعدة البيانات على سلسلة التعليمات الرئيسية. يعني هذا القيد أنه يجب عليك جعل DAO طلبات بحث غير متزامنة. الغرفة تتضمن مكتبة تكاملات مع العديد من أطر العمل المختلفة لتوفير تنفيذ طلب البحث غير المتزامن.
تندرج طلبات بحث DAO ضمن ثلاث فئات:
- طلبات البحث عن الكتابة بلقطة واحدة والتي تعمل على إدراج البيانات أو تعديلها أو حذفها في قاعدة البيانات
- طلبات القراءة لمرة واحدة التي تقرأ البيانات من قاعدة بياناتك مرة واحدة فقط وتُعرِض نتيجة تتضمّن نبذة عن قاعدة البيانات في ذلك الوقت
- استعلامات قابلة للملاحظة تقرأ البيانات من قاعدة البيانات في كل مرة تتغير جداول قاعدة البيانات الأساسية وتنبعث منها قيمًا جديدة لتعكس تلك التغييرات.
خيارات اللغة والإطار
توفّر الغرفة إمكانية الدمج لإمكانية التشغيل التفاعلي مع لغة محدّدة الميزات والمكتبات. يعرض الجدول التالي أنواع النتائج السارية استنادًا إلى نوع الاستعلام والإطار:
نوع طلب البحث | ميزات لغة Kotlin | لغة RxJava | جوافة | مراحل النشاط في Jetpack |
---|---|---|---|---|
الكتابة بنقرة واحدة | الكوروتين (suspend ) |
Single<T> ، Maybe<T> ،
Completable |
ListenableFuture<T> |
لا ينطبق |
القراءة بنقرة واحدة | الكوروتين (suspend ) |
Single<T> ، Maybe<T> |
ListenableFuture<T> |
لا ينطبق |
قراءة يمكن ملاحظتها | Flow<T> |
Flowable<T> ، Publisher<T> ،
Observable<T> |
لا ينطبق | LiveData<T> |
يوضّح هذا الدليل ثلاث طرق محتملة لاستخدام عمليات الدمج هذه لتطبيق طلبات بحث غير متزامنة في DAO.
لغة Kotlin مع معلومات التدفق والكوروتين
توفّر لغة Kotlin ميزات لغة تتيح لك كتابة طلبات بحث غير متزامنة. بدون أُطر عمل تابعة لجهات خارجية:
- في الغرفة 2.2 والإصدارات الأحدث، يمكنك استخدام لغة استعلام التدفق وظيفة لكتابة استعلامات قابلة للملاحظة.
- في الغرفة 2.1 والإصدارات الأحدث، يمكنك استخدام الكلمة الرئيسية
suspend
لإنشاء DAO طلبات البحث غير متزامنة باستخدام الكوروتينات في Kotlin.
Java باستخدام RxJava
إذا كان تطبيقك يستخدم لغة برمجة Java، فيمكنك استخدام إرجاع متخصص من إطار عمل RxJava لكتابة طرق DAO غير متزامنة. توفير الغرفة دعم لأنواع الإرجاع التالية من RxJava 2:
- بالنسبة إلى طلبات البحث بلقطة واحدة، تتيح الغرفة 2.1 والإصدارات الأعلى
Completable
،Single<T>
, وMaybe<T>
أنواع الإرجاع. - بالنسبة إلى طلبات البحث القابلة للملاحظة، تتيح الغرفة
Publisher<T>
،Flowable<T>
, وObservable<T>
أنواع الإرجاع.
بالإضافة إلى ذلك، تتوافق الغرفة 2.3 والإصدارات الأحدث مع RxJava 3.
Java مع LiveData وJava
إذا كان تطبيقك يستخدم لغة برمجة Java ولا تريد استخدام لإطار عمل RxJava، يمكنك استخدام البدائل التالية لكتابة البيانات طلبات البحث:
- يمكنك استخدام فئة
LiveData
wrapper من Jetpack لكتابة طلبات بحث قابلة للتتبّع غير المتزامنة. - يمكنك استخدام صفحة
ListenableFuture<T>
من Java لكتابة طلبات بحث غير متزامنة بلقطة واحدة.
كتابة طلبات بحث غير متزامنة بلقطة واحدة
استعلامات لقطة واحدة هي عمليات قاعدة بيانات تعمل مرة واحدة فقط وتحصل على لقطة من البيانات في وقت التنفيذ. في ما يلي بعض الأمثلة على طلبات البحث غير المتزامنة لمرة واحدة:
Kotlin
@Dao interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertUsers(vararg users: User) @Update suspend fun updateUsers(vararg users: User) @Delete suspend fun deleteUsers(vararg users: User) @Query("SELECT * FROM user WHERE id = :id") suspend fun loadUserById(id: Int): User @Query("SELECT * from user WHERE region IN (:regions)") suspend fun loadUsersByRegion(regions: List<String>): List<User> }
Java
@Dao public interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) public Completable insertUsers(List<User> users); @Update public Completable updateUsers(List<User> users); @Delete public Completable deleteUsers(List<User> users); @Query("SELECT * FROM user WHERE id = :id") public Single<User> loadUserById(int id); @Query("SELECT * from user WHERE region IN (:regions)") public Single<List<User>> loadUsersByRegion(List<String> regions); }
Java
@Dao public interface UserDao { // Returns the number of users inserted. @Insert(onConflict = OnConflictStrategy.REPLACE) public ListenableFuture<Integer> insertUsers(List<User> users); // Returns the number of users updated. @Update public ListenableFuture<Integer> updateUsers(List<User> users); // Returns the number of users deleted. @Delete public ListenableFuture<Integer> deleteUsers(List<User> users); @Query("SELECT * FROM user WHERE id = :id") public ListenableFuture<User> loadUserById(int id); @Query("SELECT * from user WHERE region IN (:regions)") public ListenableFuture<List<User>> loadUsersByRegion(List<String> regions); }
كتابة طلبات بحث قابلة للملاحظة
الاستعلامات القابلة للتتبّع هي عمليات قراءة تُصدِر قيمًا جديدة عند حدوث تغييرات في أيّ من الجداول التي يشير إليها الاستعلام. تتمثل إحدى الطرق التي قد يساعدك هذا في الحفاظ على حداثة قائمة العناصر المعروضة الموجودة في قاعدة البيانات الأساسية، أو تحديثها، أو إزالتها. إليك بعض الأمثلة أمثلة على طلبات البحث القابلة للملاحظة:
Kotlin
@Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") fun loadUserById(id: Int): Flow<User> @Query("SELECT * from user WHERE region IN (:regions)") fun loadUsersByRegion(regions: List<String>): Flow<List<User>> }
Java
@Dao public interface UserDao { @Query("SELECT * FROM user WHERE id = :id") public Flowable<User> loadUserById(int id); @Query("SELECT * from user WHERE region IN (:regions)") public Flowable<List<User>> loadUsersByRegion(List<String> regions); }
Java
@Dao public interface UserDao { @Query("SELECT * FROM user WHERE id = :id") public LiveData<User> loadUserById(int id); @Query("SELECT * from user WHERE region IN (:regions)") public LiveData<List<User>> loadUsersByRegion(List<String> regions); }
مصادر إضافية
لمعرفة المزيد من المعلومات عن طلبات DAO غير المتزامنة، يمكنك الاطّلاع على العناصر الإضافية التالية الموارد: