অ্যান্ড্রয়েড জেটপ্যাকের রুম পার্ট ব্যবহার করে একটি স্থানীয় ডাটাবেসে ডেটা সংরক্ষণ করুন।

যে অ্যাপগুলি অ-তুচ্ছ পরিমাণে স্ট্রাকচার্ড ডেটা পরিচালনা করে সেগুলি স্থানীয়ভাবে সেই ডেটা টিকে থাকার থেকে অনেক উপকৃত হতে পারে। সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে প্রাসঙ্গিক ডেটা ক্যাশে করা যাতে ডিভাইসটি নেটওয়ার্ক অ্যাক্সেস করতে না পারে, ব্যবহারকারী অফলাইনে থাকা অবস্থায়ও সেই সামগ্রীটি ব্রাউজ করতে পারে।

রুম পারসিসটেন্স লাইব্রেরি SQLite-এর উপর একটি বিমূর্ত স্তর প্রদান করে যাতে SQLite-এর সম্পূর্ণ শক্তি ব্যবহার করার সময় সাবলীল ডাটাবেস অ্যাক্সেসের অনুমতি দেওয়া হয়। বিশেষ করে, রুম নিম্নলিখিত সুবিধা প্রদান করে:

  • এসকিউএল কোয়েরির কম্পাইল-টাইম যাচাইকরণ।
  • সুবিধাজনক টীকা যা পুনরাবৃত্তিমূলক এবং ত্রুটি-প্রবণ বয়লারপ্লেট কোড কমিয়ে দেয়।
  • স্ট্রীমলাইনড ডাটাবেস মাইগ্রেশন পাথ।

এই বিবেচনার কারণে, আমরা উচ্চতর সুপারিশ করছি যে আপনি সরাসরি SQLite API ব্যবহার করার পরিবর্তে রুম ব্যবহার করুন৷

সেটআপ

আপনার অ্যাপে রুম ব্যবহার করতে, আপনার অ্যাপের build.gradle ফাইলে নিম্নলিখিত নির্ভরতা যোগ করুন।

Kotlin

dependencies {
    val room_version = "2.6.1"

    implementation("androidx.room:room-runtime:$room_version")

    // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
    // See Add the KSP plugin to your project
    ksp("androidx.room:room-compiler:$room_version")

    // If this project only uses Java source, use the Java annotationProcessor
    // No additional plugins are necessary
    annotationProcessor("androidx.room:room-compiler:$room_version")

    // optional - Kotlin Extensions and Coroutines support for Room
    implementation("androidx.room:room-ktx:$room_version")

    // optional - RxJava2 support for Room
    implementation("androidx.room:room-rxjava2:$room_version")

    // optional - RxJava3 support for Room
    implementation("androidx.room:room-rxjava3:$room_version")

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation("androidx.room:room-guava:$room_version")

    // optional - Test helpers
    testImplementation("androidx.room:room-testing:$room_version")

    // optional - Paging 3 Integration
    implementation("androidx.room:room-paging:$room_version")
}

Groovy

dependencies {
    def room_version = "2.6.1"

    implementation "androidx.room:room-runtime:$room_version"

    // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
    // See KSP Quickstart to add KSP to your build
    ksp "androidx.room:room-compiler:$room_version"

    // If this project only uses Java source, use the Java annotationProcessor
    // No additional plugins are necessary
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // optional - RxJava2 support for Room
    implementation "androidx.room:room-rxjava2:$room_version"

    // optional - RxJava3 support for Room
    implementation "androidx.room:room-rxjava3:$room_version"

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "androidx.room:room-guava:$room_version"

    // optional - Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

    // optional - Paging 3 Integration
    implementation "androidx.room:room-paging:$room_version"
}

প্রাথমিক উপাদান

রুমে তিনটি প্রধান উপাদান রয়েছে:

  • ডাটাবেস ক্লাস যা ডাটাবেস ধারণ করে এবং আপনার অ্যাপের স্থায়ী ডেটার অন্তর্নিহিত সংযোগের জন্য প্রধান অ্যাক্সেস পয়েন্ট হিসাবে কাজ করে।
  • ডেটা সত্তা যেগুলি আপনার অ্যাপের ডাটাবেসের টেবিলের প্রতিনিধিত্ব করে।
  • ডেটা অ্যাক্সেস অবজেক্ট (DAOs) যেগুলি এমন পদ্ধতিগুলি প্রদান করে যা আপনার অ্যাপ ডেটাবেসে ডেটা জিজ্ঞাসা, আপডেট, সন্নিবেশ এবং মুছতে ব্যবহার করতে পারে৷

ডাটাবেস ক্লাস আপনার অ্যাপকে সেই ডাটাবেসের সাথে যুক্ত DAO-এর উদাহরণ প্রদান করে। পরিবর্তে, অ্যাপটি ডাটাবেস থেকে ডেটা পুনরুদ্ধার করতে DAOs ব্যবহার করতে পারে সংশ্লিষ্ট ডেটা সত্তা বস্তুর উদাহরণ হিসেবে। অ্যাপটি সংশ্লিষ্ট টেবিল থেকে সারি আপডেট করতে বা সন্নিবেশের জন্য নতুন সারি তৈরি করতে সংজ্ঞায়িত ডেটা সত্তা ব্যবহার করতে পারে। চিত্র 1 রুমের বিভিন্ন উপাদানের মধ্যে সম্পর্ককে চিত্রিত করে।

চিত্র 1. রুম লাইব্রেরি আর্কিটেকচারের চিত্র।

নমুনা বাস্তবায়ন

এই বিভাগটি একটি একক ডেটা সত্তা এবং একটি একক DAO সহ একটি রুম ডাটাবেসের একটি উদাহরণ বাস্তবায়ন উপস্থাপন করে।

ডেটা সত্তা

নিম্নলিখিত কোড একটি User ডেটা সত্তা সংজ্ঞায়িত করে। User প্রতিটি উদাহরণ অ্যাপের ডাটাবেসের একটি user টেবিলে একটি সারি উপস্থাপন করে।

কোটলিন

@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

জাভা

@Entity
public class User {
    @PrimaryKey
    public int uid;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

রুমের ডেটা সত্তা সম্পর্কে আরও জানতে, রুম সত্তা ব্যবহার করে ডেটা সংজ্ঞায়িত করা দেখুন।

ডেটা অ্যাক্সেস অবজেক্ট (DAO)

নিম্নলিখিত কোডটি UserDao নামে একটি DAO সংজ্ঞায়িত করে। UserDao সেই পদ্ধতিগুলি প্রদান করে যা অ্যাপের বাকি অংশগুলি user টেবিলের ডেটার সাথে ইন্টারঅ্যাক্ট করতে ব্যবহার করে।

কোটলিন

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}

জাভা

@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List<User> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    User findByName(String first, String last);

    @Insert
    void insertAll(User... users);

    @Delete
    void delete(User user);
}

DAOs সম্পর্কে আরও জানতে, Room DAOs ব্যবহার করে ডেটা অ্যাক্সেস করা দেখুন।

ডাটাবেস

নিম্নলিখিত কোড ডাটাবেস ধরে রাখার জন্য একটি AppDatabase ক্লাস সংজ্ঞায়িত করে। AppDatabase ডাটাবেস কনফিগারেশনকে সংজ্ঞায়িত করে এবং স্থায়ী ডেটাতে অ্যাপের প্রধান অ্যাক্সেস পয়েন্ট হিসাবে কাজ করে। ডাটাবেস ক্লাস নিম্নলিখিত শর্ত পূরণ করতে হবে:

  • ক্লাসটি অবশ্যই একটি @Database টীকা দিয়ে টীকা করতে হবে যাতে একটি entities অ্যারে অন্তর্ভুক্ত থাকে যা ডাটাবেসের সাথে যুক্ত সমস্ত ডেটা সত্তাকে তালিকাভুক্ত করে।
  • ক্লাসটি অবশ্যই একটি বিমূর্ত শ্রেণী হতে হবে যা RoomDatabase প্রসারিত করে।
  • ডাটাবেসের সাথে যুক্ত প্রতিটি DAO ক্লাসের জন্য, ডাটাবেস ক্লাসকে অবশ্যই একটি বিমূর্ত পদ্ধতি নির্ধারণ করতে হবে যাতে শূন্য আর্গুমেন্ট থাকে এবং DAO ক্লাসের একটি উদাহরণ প্রদান করে।

কোটলিন

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

জাভা

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

দ্রষ্টব্য: যদি আপনার অ্যাপটি একটি একক প্রক্রিয়ায় চলে, তাহলে একটি AppDatabase অবজেক্টকে ইনস্ট্যান্ট করার সময় আপনার সিঙ্গলটন ডিজাইন প্যাটার্ন অনুসরণ করা উচিত। প্রতিটি RoomDatabase উদাহরণ মোটামুটি ব্যয়বহুল, এবং আপনার খুব কমই একক প্রক্রিয়ার মধ্যে একাধিক দৃষ্টান্তে অ্যাক্সেসের প্রয়োজন হয়।

যদি আপনার অ্যাপ একাধিক প্রক্রিয়ায় চলে, তাহলে আপনার ডাটাবেস বিল্ডার আহ্বানে enableMultiInstanceInvalidation() অন্তর্ভুক্ত করুন। এইভাবে, যখন আপনার কাছে প্রতিটি প্রক্রিয়াতে AppDatabase একটি উদাহরণ থাকে, আপনি একটি প্রক্রিয়ায় ভাগ করা ডাটাবেস ফাইলটিকে অবৈধ করতে পারেন এবং এই অবৈধতা স্বয়ংক্রিয়ভাবে অন্যান্য প্রক্রিয়ার মধ্যে AppDatabase উদাহরণগুলিতে প্রচারিত হয়।

ব্যবহার

আপনি ডেটা সত্তা, DAO এবং ডাটাবেস অবজেক্ট সংজ্ঞায়িত করার পরে, আপনি ডাটাবেসের একটি উদাহরণ তৈরি করতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

কোটলিন

val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()

জাভা

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "database-name").build();

তারপর আপনি DAO-এর একটি উদাহরণ পেতে AppDatabase থেকে বিমূর্ত পদ্ধতিগুলি ব্যবহার করতে পারেন। পরিবর্তে, আপনি ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করতে DAO উদাহরণ থেকে পদ্ধতিগুলি ব্যবহার করতে পারেন:

কোটলিন

val userDao = db.userDao()
val users: List<User> = userDao.getAll()

জাভা

UserDao userDao = db.userDao();
List<User> users = userDao.getAll();

অতিরিক্ত সম্পদ

রুম সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন:

নমুনা

কোডল্যাব

ব্লগ