অসিঙ্ক্রোনাস DAO প্রশ্ন লিখুন

UI ব্লক করা থেকে প্রশ্নগুলি প্রতিরোধ করতে, রুম মূল থ্রেডে ডাটাবেস অ্যাক্সেসের অনুমতি দেয় না। এই নিষেধাজ্ঞার মানে হল যে আপনাকে অবশ্যই আপনার DAO প্রশ্নগুলিকে অ্যাসিঙ্ক্রোনাস করতে হবে। রুম লাইব্রেরিতে অ্যাসিঙ্ক্রোনাস ক্যোয়ারী এক্সিকিউশন প্রদানের জন্য বিভিন্ন ফ্রেমওয়ার্কের সাথে ইন্টিগ্রেশন অন্তর্ভুক্ত রয়েছে।

DAO প্রশ্নগুলি তিনটি বিভাগে পড়ে:

  • এক-শট লিখিত প্রশ্ন যা ডাটাবেসে ডেটা সন্নিবেশ, আপডেট বা মুছে দেয়।
  • ওয়ান-শট রিড ক্যোয়ারী যা আপনার ডাটাবেস থেকে ডাটা একবার পড়ে এবং সেই সময়ে ডাটাবেসের স্ন্যাপশটের সাথে ফলাফল দেয়।
  • পর্যবেক্ষণযোগ্য পঠিত প্রশ্ন যা প্রতিবার অন্তর্নিহিত ডাটাবেস টেবিলগুলি পরিবর্তিত হলে এবং সেই পরিবর্তনগুলিকে প্রতিফলিত করতে নতুন মান নির্গত করার সময় আপনার ডাটাবেস থেকে ডেটা পড়ে।

ভাষা এবং কাঠামোর বিকল্প

রুম নির্দিষ্ট ভাষা বৈশিষ্ট্য এবং লাইব্রেরির সাথে আন্তঃকার্যযোগ্যতার জন্য একীকরণ সমর্থন প্রদান করে। নিম্নলিখিত সারণীটি প্রশ্নের ধরন এবং কাঠামোর উপর ভিত্তি করে প্রযোজ্য রিটার্ন প্রকারগুলি দেখায়:

প্রশ্নের ধরন কোটলিন ভাষার বৈশিষ্ট্য আরএক্সজাভা পেয়ারা জেটপ্যাক লাইফসাইকেল
এক-শট লিখুন করুটিন ( 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-তে অ্যাসিঙ্ক্রোনাস প্রশ্নগুলি বাস্তবায়ন করতে এই ইন্টিগ্রেশনগুলি ব্যবহার করতে পারেন।

ফ্লো এবং couroutines সঙ্গে Kotlin

কোটলিন ভাষার বৈশিষ্ট্যগুলি প্রদান করে যা আপনাকে তৃতীয় পক্ষের ফ্রেমওয়ার্ক ছাড়াই অ্যাসিঙ্ক্রোনাস প্রশ্নগুলি লিখতে দেয়:

  • রুম 2.2 এবং উচ্চতর, আপনি পর্যবেক্ষণযোগ্য প্রশ্নগুলি লিখতে কোটলিনের ফ্লো কার্যকারিতা ব্যবহার করতে পারেন।
  • রুম 2.1 এবং উচ্চতর, আপনি Kotlin coroutines ব্যবহার করে আপনার DAO প্রশ্নগুলিকে অ্যাসিঙ্ক্রোনাস করতে suspend কীওয়ার্ড ব্যবহার করতে পারেন।

RxJava সহ জাভা

যদি আপনার অ্যাপ জাভা প্রোগ্রামিং ভাষা ব্যবহার করে, তাহলে আপনি অ্যাসিঙ্ক্রোনাস DAO পদ্ধতি লিখতে RxJava ফ্রেমওয়ার্ক থেকে বিশেষ রিটার্ন টাইপ ব্যবহার করতে পারেন। রুম নিম্নলিখিত RxJava 2 রিটার্ন প্রকারের জন্য সমর্থন প্রদান করে:

  • এক-শট প্রশ্নের জন্য, রুম 2.1 এবং উচ্চতর Completable , Single<T> , এবং Maybe<T> রিটার্ন প্রকারগুলিকে সমর্থন করে৷
  • পর্যবেক্ষণযোগ্য প্রশ্নের জন্য, রুম Publisher<T> , Flowable<T> , এবং Observable<T> রিটার্ন প্রকারগুলিকে সমর্থন করে৷

উপরন্তু, রুম 2.3 এবং উচ্চতর RxJava 3 সমর্থন করে।

LiveData এবং Guava সহ জাভা

যদি আপনার অ্যাপ জাভা প্রোগ্রামিং ভাষা ব্যবহার করে এবং আপনি RxJava ফ্রেমওয়ার্ক ব্যবহার করতে না চান, তাহলে আপনি অ্যাসিঙ্ক্রোনাস প্রশ্নগুলি লিখতে নিম্নলিখিত বিকল্পগুলি ব্যবহার করতে পারেন:

  • অ্যাসিঙ্ক্রোনাস পর্যবেক্ষণযোগ্য প্রশ্ন লিখতে আপনি জেটপ্যাক থেকে LiveData র্যাপার ক্লাস ব্যবহার করতে পারেন।
  • অ্যাসিঙ্ক্রোনাস ওয়ান-শট প্রশ্ন লিখতে আপনি Guava থেকে ListenableFuture<T> র‌্যাপার ব্যবহার করতে পারেন।

অ্যাসিঙ্ক্রোনাস এক-শট প্রশ্ন লিখুন

ওয়ান-শট কোয়েরি হল ডাটাবেস ক্রিয়াকলাপ যা শুধুমাত্র একবার চালানো হয় এবং সম্পাদনের সময় ডেটার একটি স্ন্যাপশট দখল করে। এখানে অ্যাসিঙ্ক্রোনাস ওয়ান-শট প্রশ্নের কিছু উদাহরণ রয়েছে:

কোটলিন

@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 প্রশ্নগুলি সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন:

ব্লগ