SQLite API সরাসরি ব্যবহার করার পরিবর্তে Room পারসিসটেন্স লাইব্রেরি ব্যবহার করলে অনেক সুবিধা পাওয়া যায়:
- SQL কোয়েরির কম্পাইল-টাইম যাচাইকরণ
- সুবিধাজনক অ্যানোটেশন যা পুনরাবৃত্তিমূলক এবং ভুল-প্রবণ বয়লারপ্লেট কোড কম করে
- স্ট্রিমলাইন করা ডেটাবেস মাইগ্রেশন পাথ
আপনার অ্যাপে যদি Room নয় এমন SQLite প্রয়োগ করা থাকে, তাহলে Room-এ কীভাবে মাইগ্রেট করবেন তা জানতে এই পৃষ্ঠাটি পড়ুন। আপনার অ্যাপে Room প্রথম SQLite ইমপ্লিমেন্টেশন হলে, প্রাথমিক ব্যবহারের জন্য Room ব্যবহার করে লোকাল ডেটাবেসে ডেটা সেভ করুন দেখুন।
মাইগ্রেশনের ধাপ
আপনার SQLite ইমপ্লিমেন্টেশন Room-এ মাইগ্রেট করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন। আপনার SQLite ইমপ্লিমেন্টেশনে বড় ডেটাবেস বা জটিল কোয়েরি ব্যবহার করা হলে, আপনি হয়ত ধীরে ধীরে Room-এ মাইগ্রেট করতে চাইবেন। ইনক্রিমেন্টাল মাইগ্রেশন কৌশল সম্পর্কে আরও জানতে, ইনক্রিমেন্টাল মাইগ্রেশন দেখুন।
ডিপেন্ডেন্সি আপডেট করা
আপনার অ্যাপে Room ব্যবহার করতে, আপনাকে অবশ্যই অ্যাপের build.gradle ফাইলে
উপযুক্ত ডিপেন্ডেন্সি অন্তর্ভুক্ত করতে হবে। রুমের পারস্পরিক নির্ভরতা সম্পর্কে আরও জানতে, সেট-আপ দেখুন।
মডেল ক্লাসকে ডেটা এন্টিটি হিসেবে আপডেট করা
ডেটাবেসে টেবিল দেখানোর জন্য Room ডেটা এন্টিটি ব্যবহার করে। প্রতিটি এনটিটি ক্লাস একটি টেবিলকে বোঝায় এবং এর এমন প্রপার্টি থাকে যা সেই টেবিলের কলামকে বোঝায়। আপনার আগে থেকেই আছে এমন মডেল ক্লাসকে Room entities হিসেবে আপডেট করতে এইসব ধাপ অনুসরণ করুন:
- এটি যে একটি
Room এন্টিটি তা বোঝাতে ক্লাস ঘোষণার সাথে
@Entityঅ্যানোটেশন যোগ করুন। আপনি ঐচ্ছিকভাবেtableNameপ্রপার্টি ব্যবহার করে এটি বোঝাতে পারেন যে ফলাফল হিসেবে প্রাপ্ত টেবিলের নাম যেন ক্লাসের নামের থেকে আলাদা হয়। @PrimaryKeyদিয়ে প্রাইমারি কী প্রপার্টি অ্যানোটেট করুন।- ফলাফল হিসেবে প্রাপ্ত টেবিলে কোনও কলামের নাম যদি সংশ্লিষ্ট প্রপার্টির নামের থেকে
আলাদা হয়, তাহলে
@ColumnInfoদিয়ে প্রপার্টিকে অ্যানোটেট করুন এবংnameপ্রপার্টিকে সঠিক কলামের নামে সেট করুন। - ক্লাসে এমন প্রপার্টি থাকলে যা আপনি ডেটাবেসে সেভ করে রাখতে চান না,
সেইসব প্রপার্টিকে
@Ignoreদিয়ে অ্যানোটেট করুন যাতে বোঝা যায় যে Room যেন সংশ্লিষ্ট টেবিলে সেগুলির জন্য কলাম তৈরি না করে। - ক্লাসে একাধিক কনস্ট্রাক্টর থাকলে, Room কোন কনস্ট্রাক্টর ব্যবহার করবে তা
@Ignoreদিয়ে অন্য সব কনস্ট্রাক্টরকে অ্যানোটেট করে বুঝিয়ে দিন।
@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) ব্যবহার করে। Room DAO ব্যবহার করে ডেটা অ্যাক্সেস করা লিঙ্কে দেওয়া নির্দেশাবলী অনুসরণ করে আপনার আগে থেকে থাকা কোয়েরি ফাংশনগুলিকে DAO-এর সাথে পাল্টে নিন।
ডেটাবেস ক্লাস তৈরি করা
ডেটাবেসের ইনস্ট্যান্স ম্যানেজ করার জন্য Room-এর ইমপ্লিমেন্টেশনে একটি ডেটাবেস ক্লাস ব্যবহার করা হয়।
আপনার ডেটাবেস ক্লাসকে RoomDatabase-এর এক্সটেন্ড করতে হবে এবং আপনার
সংজ্ঞায়িত সমস্ত এন্টিটি ও DAO-কে রেফারেন্স করতে হবে।
@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-এ ডেটাবেস মাইগ্রেশন পাথ সম্পর্কে আরও তথ্য পেতে, আপনার ডেটাবেস মাইগ্রেট করুন দেখুন।
ডেটাবেস ইনস্ট্যানসিয়েশন আপডেট করা
ডেটাবেস ক্লাস ও মাইগ্রেশন পাথ নির্ধারণ করার পরে, আপনি
মাইগ্রেশন পাথ প্রয়োগ করে আপনার ডেটাবেসের একটি ইনস্ট্যান্স তৈরি করতে
Room.databaseBuilder ব্যবহার করতে পারবেন:
val db = Room.databaseBuilder<UsersDatabase>(applicationContext, "database-name") .addMigrations(MIGRATION_1_2) .build()
আপনার প্রয়োগ পরীক্ষা করুন
আপনার নতুন Room প্রয়োগ পরীক্ষা করে নিতে ভুলবেন না:
- আপনার ডেটাবেস মাইগ্রেশন পরীক্ষা করতে, টেস্ট মাইগ্রেশন লিঙ্কে দেওয়া নির্দেশাবলী অনুসরণ করুন।
- আপনার DAO ফাংশন পরীক্ষা করতে, আপনার ডেটাবেস পরীক্ষা করুন লিঙ্কে দেওয়া নির্দেশাবলী অনুসরণ করুন।
ইনক্রিমেন্টাল মাইগ্রেশন
আপনার অ্যাপ যদি বড় ও জটিল ডেটাবেস ব্যবহার করে, তাহলে আপনার অ্যাপকে একবারে Room-এ মাইগ্রেট করা সম্ভব নাও হতে পারে। পরিবর্তে, আপনি প্রথম ধাপ হিসেবে ঐচ্ছিকভাবে ডেটা এনটিটি ও Room ডেটাবেস প্রয়োগ করতে পারেন এবং তারপরে আপনার কোয়েরি ফাংশন পরে DAO-তে মাইগ্রেট করতে পারেন।
ইনক্রিমেন্টাল মাইগ্রেশন প্রয়োগ করতে, androidx.room3:room3-sqlite-wrapper আর্টিফ্যাক্ট থেকে roomDatabase.getSupportWrapper এক্সটেনশন
ফাংশন ব্যবহার করে SupportSQLiteDatabase
মানানসই র্যাপার পান। এই র্যাপার
আপনাকে Android SQLite API ব্যবহার করে
Room-ম্যানেজ করা ডেটাবেসে সরাসরি Android-স্টাইল SQL কোয়েরি এক্সিকিউট করতে দেয়:
// Get SupportSQLiteDatabase wrapper val legacyDb = roomDatabase.getSupportWrapper() legacyDb.execSQL("INSERT INTO users ...")