كتابة طلبات بحث 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 with Flow وCouroutine

توفّر لغة Kotlin ميزات لغوية تتيح لك كتابة طلبات بحث غير متزامنة بدون أُطر عمل تابعة لجهات خارجية:

  • في الغرفة 2.2 والأحدث، يمكنك استخدام وظيفة Flow في لغة Kotlin لكتابة طلبات بحث يمكن ملاحظتها.
  • في الغرفة 2.1 والأحدث، يمكنك استخدام الكلمة الرئيسية suspend لجعل طلبات بحث DAO غير متزامنة باستخدام ملفات كوروتيين كوتلين.

لغة Java مع RxJava

إذا كان تطبيقك يستخدم لغة برمجة Java، يمكنك استخدام أنواع إرجاع متخصصة من إطار عمل RxJava لكتابة طُرق DAO غير متزامنة. توفر الغرفة دعمًا لأنواع إرجاع RxJava 2 التالية:

  • بالنسبة إلى طلبات البحث التي تتم لمرة واحدة، يتيح تطبيق Room 2.1 والإصدارات الأحدث استخدام أنواع الإرجاع Completable وSingle<T> وMaybe<T>.
  • بالنسبة إلى طلبات البحث التي يمكن ملاحظتها، تتيح خدمة Room أنواع الإرجاع Publisher<T> وFlowable<T> وObservable<T>.

بالإضافة إلى ذلك، يدعم Room 2.3 والإصدارات الأعلى RxJava 3.

Java باستخدام بيانات LiveData وJuava

إذا كان تطبيقك يستخدم لغة برمجة Java ولا تريد استخدام إطار عمل RxJava، يمكنك استخدام البدائل التالية لكتابة طلبات بحث غير متزامنة:

  • يمكنك استخدام فئة برامج تضمين LiveData من Jetpack لكتابة طلبات بحث غير متزامنة قابلة للملاحظة.
  • يمكنك استخدام برنامج تضمين ListenableFuture<T> من Guava لكتابة طلبات بحث غير متزامنة لمرة واحدة.

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

الاستعلامات ذات اللقطة الواحدة هي عمليات قاعدة بيانات تعمل مرة واحدة فقط وتحصل على لقطة من البيانات في وقت التنفيذ. في ما يلي بعض الأمثلة على طلبات البحث غير المتزامنة من نقطة واحدة:

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 غير المتزامنة، اطّلِع على المراجع الإضافية التالية:

عيّنات

المدوّنات