SQLite থেকে রুমে স্থানান্তর করুন

সরাসরি SQLite API ব্যবহার করার তুলনায় Room পার্সিস্টেন্স লাইব্রেরিটি বেশ কিছু সুবিধা প্রদান করে:

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

আপনার অ্যাপে যদি Room ছাড়া অন্য কোনো SQLite ইমপ্লিমেন্টেশন থাকে, তাহলে Room-এ মাইগ্রেট করার পদ্ধতি জানতে এই পৃষ্ঠাটি পড়ুন। আপনার অ্যাপে যদি Room-ই প্রথম SQLite ইমপ্লিমেন্টেশন হয়, তাহলে সাধারণ ব্যবহারের জন্য Room ব্যবহার করে লোকাল ডেটাবেসে ডেটা সেভ করার পদ্ধতিটি দেখুন।

অভিবাসনের পদক্ষেপ

আপনার SQLite ইমপ্লিমেন্টেশনকে Room-এ মাইগ্রেট করতে নিম্নলিখিত ধাপগুলি অনুসরণ করুন। যদি আপনার SQLite ইমপ্লিমেন্টেশন একটি বড় ডাটাবেস বা জটিল কোয়েরি ব্যবহার করে, তবে আপনি পর্যায়ক্রমে Room-এ মাইগ্রেট করতে পছন্দ করতে পারেন। পর্যায়ক্রমিক মাইগ্রেশন কৌশল সম্পর্কে আরও তথ্যের জন্য, "পর্যায়ক্রমিক মাইগ্রেশন" দেখুন।

নির্ভরতা আপডেট করুন

আপনার অ্যাপে Room ব্যবহার করতে হলে, অ্যাপের build.gradle ফাইলে উপযুক্ত ডিপেন্ডেন্সিগুলো অবশ্যই অন্তর্ভুক্ত করতে হবে। Room ডিপেন্ডেন্সি সম্পর্কে আরও তথ্যের জন্য, সেটআপ দেখুন।

ডেটা এনটিটিগুলিতে মডেল ক্লাসগুলি আপডেট করুন

Room ডাটাবেসের টেবিলগুলোকে উপস্থাপন করার জন্য ডেটা এনটিটি ব্যবহার করে। প্রতিটি এনটিটি ক্লাস একটি টেবিলকে প্রতিনিধিত্ব করে এবং এর প্রোপার্টিগুলো সেই টেবিলের কলামগুলোকে নির্দেশ করে। আপনার বিদ্যমান মডেল ক্লাসগুলোকে Room এনটিটিতে আপডেট করতে এই ধাপগুলো অনুসরণ করুন:

  1. এটি যে একটি Room এনটিটি, তা বোঝানোর জন্য ক্লাস ডিক্লারেশনটিকে @Entity দিয়ে অ্যানোটেট করুন। আপনি চাইলে tableName প্রপার্টি ব্যবহার করে বোঝাতে পারেন যে, তৈরি হওয়া টেবিলটির নাম ক্লাসের নাম থেকে ভিন্ন হবে।
  2. প্রাইমারি কী প্রপার্টিকে @PrimaryKey দিয়ে টীকাযুক্ত করুন।
  3. ফলাফল টেবিলের কোনো কলামের নাম যদি সংশ্লিষ্ট প্রপার্টির নাম থেকে ভিন্ন হয়, তাহলে প্রপার্টিটিকে @ColumnInfo দিয়ে অ্যানোটেট করুন এবং name প্রপার্টিতে সঠিক কলামের নামটি সেট করুন।
  4. যদি ক্লাসটিতে এমন প্রোপার্টি থাকে যা আপনি ডাটাবেসে রাখতে চান না, তাহলে সেই প্রোপার্টিগুলোকে @Ignore দিয়ে অ্যানোটেট করুন, যাতে Room সংশ্লিষ্ট টেবিলে সেগুলোর জন্য কলাম তৈরি না করে।
  5. যদি ক্লাসটিতে একাধিক কনস্ট্রাক্টর থাকে, তাহলে অন্য সব কনস্ট্রাক্টরকে @Ignore দিয়ে অ্যানোটেট করে নির্দেশ করুন যে Room কোন কনস্ট্রাক্টরটি ব্যবহার করবে।

@Entity(tableName = "users")
data class User(
    @PrimaryKey @ColumnInfo(name = "userid") val id: String,
    @ColumnInfo(name = "username") val userName: String?,
    @ColumnInfo(name = "last_update") val date: Date?,
)

DAO তৈরি করুন

Room ডাটাবেস অ্যাক্সেস করার ফাংশনগুলো সংজ্ঞায়িত করতে ডেটা অ্যাক্সেস অবজেক্ট (DAO) ব্যবহার করে। আপনার বিদ্যমান কোয়েরি ফাংশনগুলোকে DAO দিয়ে প্রতিস্থাপন করতে, “Accessing data using Room DAOs” শীর্ষক নির্দেশিকা অনুসরণ করুন।

একটি ডাটাবেস ক্লাস তৈরি করুন

Room-এর ইমপ্লিমেন্টেশনগুলো ডাটাবেসের একটি ইনস্ট্যান্স পরিচালনা করার জন্য একটি ডাটাবেস ক্লাস ব্যবহার করে। আপনার ডাটাবেস ক্লাসটি RoomDatabase এক্সটেন্ড করবে এবং আপনার সংজ্ঞায়িত সমস্ত এনটিটি ও ডিএও-কে রেফারেন্স করবে।

@Database(entities = [User::class], version = 2)
@ColumnTypeConverters(DateConverter::class)
abstract class UsersDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

একটি মাইগ্রেশন পথ নির্ধারণ করুন

যেহেতু ডাটাবেস ভার্সন নম্বর পরিবর্তিত হচ্ছে, তাই বিদ্যমান ডাটাবেস ডেটা সংরক্ষণ করার জন্য আপনাকে অবশ্যই একটি Migration অবজেক্ট সংজ্ঞায়িত করতে হবে। যদি ডাটাবেস স্কিমা পরিবর্তিত না হয়, তবে এই মাইগ্রেশনটি খালি থাকতে পারে।

val MIGRATION_1_2 = object : Migration(1, 2) {
    override suspend fun migrate(connection: SQLiteConnection) {
        // Empty implementation, because the schema isn't changing.
    }
}

Room-এ ডাটাবেস মাইগ্রেশনের পথগুলো সম্পর্কে আরও তথ্যের জন্য, আপনার ডাটাবেস মাইগ্রেট করুন (Migrate your database) দেখুন।

ডাটাবেস ইনস্ট্যানসিয়েশন আপডেট করুন

একটি ডাটাবেস ক্লাস এবং একটি মাইগ্রেশন পাথ নির্ধারণ করার পরে, আপনি Room.databaseBuilder ব্যবহার করে মাইগ্রেশন পাথটি প্রয়োগ করে আপনার ডাটাবেসের একটি ইনস্ট্যান্স তৈরি করতে পারেন:

val db =
    Room.databaseBuilder<UsersDatabase>(applicationContext, "database-name")
        .addMigrations(MIGRATION_1_2)
        .build()

আপনার বাস্তবায়ন পরীক্ষা করুন

আপনার নতুন Room ইমপ্লিমেন্টেশনটি পরীক্ষা করে নিশ্চিত হন:

ক্রমবর্ধমান স্থানান্তর

আপনার অ্যাপ যদি একটি বড় ও জটিল ডেটাবেস ব্যবহার করে, তবে একবারে পুরো অ্যাপটিকে Room-এ মাইগ্রেট করা সম্ভব নাও হতে পারে। এর পরিবর্তে, আপনি প্রথম ধাপ হিসেবে ডেটা এনটিটি এবং Room ডেটাবেস ইমপ্লিমেন্ট করতে পারেন এবং পরে আপনার কোয়েরি ফাংশনগুলোকে DAO-তে মাইগ্রেট করতে পারেন।

পর্যায়ক্রমিক মাইগ্রেশন বাস্তবায়ন করতে, androidx.room3:room3-sqlite-wrapper আর্টিফ্যাক্ট থেকে roomDatabase.getSupportWrapper এক্সটেনশন ফাংশনটি ব্যবহার করে একটি SupportSQLiteDatabase কম্প্যাটিবিলিটি র‍্যাপার সংগ্রহ করুন। এই র‍্যাপারটি আপনাকে অ্যান্ড্রয়েড SQLite API ব্যবহার করে Room-পরিচালিত ডেটাবেসে সরাসরি অ্যান্ড্রয়েড-স্টাইলের SQL কোয়েরি চালাতে দেয়:

// Get SupportSQLiteDatabase wrapper
val legacyDb = roomDatabase.getSupportWrapper()
legacyDb.execSQL("INSERT INTO users ...")