كتابة طلبات بحث DAO غير المتزامنة

لمنع الطلبات من حظر واجهة المستخدم، لا تسمح الغرفة بالوصول إلى قاعدة البيانات على سلسلة التعليمات الرئيسية. يعني هذا القيد أنه يجب عليك جعل 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 غير المتزامنة، يمكنك الاطّلاع على العناصر الإضافية التالية الموارد:

نماذج

المدوّنات