پرس و جوهای DAO ناهمزمان را بنویسید

برای جلوگیری از مسدود کردن پرس‌وجوها، اتاق اجازه دسترسی به پایگاه داده در رشته اصلی را نمی‌دهد. این محدودیت به این معنی است که شما باید پرس و جوهای DAO خود را ناهمزمان کنید. کتابخانه اتاق شامل ادغام هایی با چندین چارچوب مختلف برای ارائه اجرای پرس و جو ناهمزمان است.

پرس و جوهای DAO به سه دسته تقسیم می شوند:

  • پرس و جوهایی را به صورت تک شات بنویسید که داده ها را در پایگاه داده وارد می کنند، به روز می کنند یا حذف می کنند.
  • پرس و جوهای خواندنی تک شات که داده ها را از پایگاه داده شما فقط یک بار می خوانند و نتیجه را با عکس فوری پایگاه داده در آن زمان برمی گردند.
  • پرس و جوهای خواندنی قابل مشاهده که هر بار که جداول پایگاه داده زیربنایی تغییر می کنند، داده ها را از پایگاه داده شما می خوانند و مقادیر جدیدی را برای منعکس کردن آن تغییرات منتشر می کنند.

گزینه های زبان و چارچوب

اتاق پشتیبانی یکپارچه‌سازی برای قابلیت همکاری با ویژگی‌ها و کتابخانه‌های زبانی خاص را فراهم می‌کند. جدول زیر انواع بازگشت قابل اجرا را بر اساس نوع پرس و جو و چارچوب نشان می دهد:

نوع پرس و جو ویژگی های زبان کاتلین RxJava گواوا چرخه حیات جت پک
یک شات بنویس کوروتین ها ( suspend ) Single<T> ، Maybe<T> ، Completable ListenableFuture<T> N/A
یک شات خواندن کوروتین ها ( suspend ) Single<T> ، Maybe<T> ListenableFuture<T> N/A
قابل مشاهده است Flow<T> Flowable<T> , Publisher<T> , Observable<T> N/A LiveData<T>

این راهنما سه راه ممکن را نشان می دهد که می توانید از این ادغام ها برای پیاده سازی پرس و جوهای ناهمزمان در DAO های خود استفاده کنید.

کاتلین با Flow و coroutines

Kotlin ویژگی های زبانی را ارائه می دهد که به شما امکان می دهد پرس و جوهای ناهمزمان را بدون چارچوب های شخص ثالث بنویسید:

  • در اتاق 2.2 و بالاتر، می توانید از عملکرد Kotlin's Flow برای نوشتن پرس و جوهای قابل مشاهده استفاده کنید.
  • در اتاق 2.1 و بالاتر، می‌توانید از کلمه کلیدی suspend استفاده کنید تا با استفاده از کوروتین‌های Kotlin ، پرس‌وجوهای DAO خود را ناهمزمان کنید.

جاوا با RxJava

اگر برنامه شما از زبان برنامه نویسی جاوا استفاده می کند، می توانید از انواع برگشتی تخصصی از چارچوب RxJava برای نوشتن متدهای DAO ناهمزمان استفاده کنید. Room از انواع RxJava 2 زیر پشتیبانی می کند:

  • برای پرس و جوهای تک شات، Room 2.1 و بالاتر از انواع بازگشت Completable ، Single<T> و Maybe<T> پشتیبانی می کند.
  • برای پرس و جوهای قابل مشاهده، Room از انواع بازگشت Publisher<T> ، Flowable<T> و Observable<T> پشتیبانی می کند.

علاوه بر این، Room 2.3 و بالاتر از RxJava 3 پشتیبانی می کند.

جاوا با LiveData و Guava

اگر برنامه شما از زبان برنامه نویسی جاوا استفاده می کند و نمی خواهید از چارچوب RxJava استفاده کنید، می توانید از جایگزین های زیر برای نوشتن پرس و جوهای ناهمزمان استفاده کنید:

  • شما می توانید از کلاس پوشش دهنده LiveData از Jetpack برای نوشتن پرس و جوهای قابل مشاهده ناهمزمان استفاده کنید.
  • شما می توانید از پوشش ListenableFuture<T> از Guava برای نوشتن پرس و جوهای تک شات ناهمزمان استفاده کنید.

پرس و جوهای ناهمزمان تک شات بنویسید

پرس و جوهای تک شات، عملیات پایگاه داده ای هستند که فقط یک بار اجرا می شوند و در زمان اجرا یک عکس فوری از داده ها را می گیرند. در اینجا چند نمونه از پرس و جوهای یکباره ناهمزمان آورده شده است:

کاتلین

@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>
}

جاوا

@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);
}

جاوا

@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);
}

پرس و جوهای قابل مشاهده بنویسید

پرس و جوهای قابل مشاهده، عملیات خواندنی هستند که هر زمان که تغییراتی در هر یک از جداولی که توسط پرس و جو به آنها ارجاع داده می شود، مقادیر جدیدی را منتشر می کنند. یکی از راه‌هایی که می‌توانید از آن استفاده کنید این است که به شما کمک می‌کند یک لیست نمایش داده شده از موارد را به‌روز نگه دارید، زیرا موارد در پایگاه داده زیربنایی درج، به‌روزرسانی یا حذف می‌شوند. در اینجا چند نمونه از پرس و جوهای قابل مشاهده آورده شده است:

کاتلین

@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>>
}

جاوا

@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);
}

جاوا

@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، به منابع اضافی زیر مراجعه کنید:

نمونه ها

وبلاگ ها