Room এন্টিটি ব্যবহার করে ডেটা সংজ্ঞায়িত করা

আপনার অ্যাপের ডেটা স্টোর করার জন্য Room পারসিস্টেন্স লাইব্রেরি ব্যবহার করলে, আপনি স্টোর করতে চান এমন অবজেক্টের প্রতিনিধিত্ব করার জন্য এন্টিটি নির্ধারণ করেন। প্রতিটি এন্টিটি সম্পর্কিত Room ডেটাবেসের একটি টেবিলের সাথে সম্পর্কিত এবং প্রতিটি এন্টিটির ইনস্ট্যান্স সংশ্লিষ্ট টেবিলের ডেটার একটি সারিকে বোঝায়।

Room এন্টিটি ব্যবহার করে আপনি কোনও SQL কোড না লিখেও ডেটাবেস স্কিমা নির্ধারণ করতে পারবেন।

এন্টিটির গঠনতন্ত্র

আপনি প্রতিটি Room এন্টিটিকে @Entity দিয়ে অ্যানোটেশন করা ক্লাস হিসেবে সংজ্ঞায়িত করেন। Room এনটিটিতে ডেটাবেসের সংশ্লিষ্ট টেবিলের প্রতিটি কলামের প্রপার্টি অন্তর্ভুক্ত থাকে, এর মধ্যে এক বা একাধিক কলাম থাকে যা প্রাইমারি কী তৈরি করে।

নিচে দেওয়া কোডটি এমন একটি এন্টিটির উদাহরণ যা ID, প্রথম নাম ও পদবি সহ User টেবিল কে ডিফাইন করে:

@Entity
data class User(
    @PrimaryKey val id: Int,
    val firstName: String,
    val lastName: String
)

ডিফল্ট হিসেবে, Room ডেটাবেস টেবিলের নাম হিসেবে ক্লাসের নাম ব্যবহার করে। আপনি যদি চান যে টেবিলটির একটি আলাদা নাম থাকুক, তাহলে @Entity অ্যানোটেশনের tableName প্রপার্টি সেট করুন। একইভাবে, Room ডিফল্ট হিসেবে ডেটাবেসে প্রপার্টির নামকে কলামের নাম হিসেবে ব্যবহার করে। আপনি যদি চান যে কোনও কলামের আলাদা নাম থাকুক, তাহলে প্রপার্টিতে @ColumnInfo অ্যানোটেশন যোগ করুন এবং name প্রপার্টি সেট করুন। নিচে দেওয়া উদাহরণে টেবিল ও তার কলামের কাস্টম নাম দেখানো হয়েছে:

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

প্রাইমারি কী নির্ধারণ করা

আপনাকে অবশ্যই প্রতিটি Room এন্টিটির জন্য একটি প্রাইমারি কী নির্ধারণ করতে হবে যাতে সংশ্লিষ্ট ডেটাবেস টেবিলের প্রতিটি সারিকে অনন্যভাবে শনাক্ত করা যায়। এটি করতে, @PrimaryKey দিয়ে একটি কলামে অ্যানোটেশন দিন:

@PrimaryKey val id: Int

যৌগিক প্রাইমারি কী নির্ধারণ করা

একাধিক কলামের কম্বিনেশনের মাধ্যমে কোনও এন্টিটির ইনস্ট্যান্সকে অনন্যভাবে শনাক্ত করার প্রয়োজন হলে, আপনি @Entity-এর primaryKeys প্রপার্টিতে সেইসব কলামের তালিকা তৈরি করে কম্পোজিট প্রাইমারি কী নির্ধারণ করতে পারেন:

@Entity(primaryKeys = ["firstName", "lastName"])
data class User(
    val firstName: String,
    val lastName: String
)

প্রপার্টি উপেক্ষা করা

ডিফল্ট হিসেবে, এন্টিটিতে উল্লেখ করা প্রতিটি প্রপার্টির জন্য Room একটি কলাম তৈরি করে। Room যাতে কোনও প্রপার্টি সেভ করে না রাখে, তার জন্য @Ignore দিয়ে সেটিকে অ্যানোটেট করুন:

@Entity
data class User(
    @PrimaryKey val id: Int,
    val firstName: String,
    val lastName: String,
    @Ignore val picture: Bitmap? = null
)

কোনও এন্টিটি যদি মূল এন্টিটির থেকে প্রপার্টি উত্তরাধিকার সূত্রে পায়, তাহলে @Entity অ্যানোটেশনের ignoredColumns প্রপার্টি ব্যবহার করুন:

open class User {
    var picture: Bitmap? = null
}

@Entity(ignoredColumns = ["picture"])
data class RemoteUser(
    @PrimaryKey val id: Int,
    val hasVpn: Boolean
) : User()

Room-এ এমন অনেক অ্যানোটেশন কাজ করে যা আপনাকে ডেটাবেস টেবিলের বিবরণ সার্চ করতে দেয়।

সম্পূর্ণ টেক্সট সার্চ করা যায়

আপনার অ্যাপে দ্রুত ফুল-টেক্সট সার্চ (FTS) করার প্রয়োজন হলে, ভার্চুয়াল টেবিলের মাধ্যমে আপনার এন্টিটি ব্যাক-আপ নিন। FTS3 বা FTS4 SQLite এক্সটেনশন অথবা FTS5 SQLite এক্সটেনশন ব্যবহার করুন।

এই ক্ষমতা ব্যবহার করতে, কোনও এন্টিটিতে @Fts3, @Fts4, বা @Fts5 অ্যানোটেশন যোগ করুন।

// Use `@Fts3` only if your app has strict disk space requirements.
@Fts4
@Entity(tableName = "users")
data class User(
    // Specifying a primary key for an FTS-table-backed entity is optional,
    // but if you include one, it must an INTEGER type and column name "rowid".
    @PrimaryKey @ColumnInfo(name = "rowid") val id: Long,
    @ColumnInfo(name = "first_name") val firstName: String
)

FTS টেবিলে কীভাবে ডেটাবেস তথ্য টোকেনাইজ করা হয় তা কাস্টমাইজ করতে, tokenizer বিকল্প ব্যবহার করুন। Room-এ FtsOptions-এর মাধ্যমে TOKENIZER_SIMPLE, TOKENIZER_PORTER ও TOKENIZER_UNICODE61 সহ একাধিক বিল্ট-ইন টোকেনাইজার প্রদান করা হয়:

@Fts4(tokenizer = FtsOptions.TOKENIZER_UNICODE61)
@Entity(tableName = "users")
data class User(
    @PrimaryKey @ColumnInfo(name = "rowid") val id: Long,
    @ColumnInfo(name = "first_name") val firstName: String
)

FTS-এর মাধ্যমে ম্যানেজ করা এন্টিটি সংজ্ঞায়িত করার জন্য Room আরও অনেক বিকল্প প্রদান করে, যার মধ্যে রয়েছে ফলাফল অর্ডারিং, কলাম থেকে ইন্ডেক্স সরানো এবং এক্সটার্নাল কন্টেন্ট হিসেবে ম্যানেজ করা টেবিল। এইসব বিকল্প সম্পর্কে আরও তথ্য পেতে, FtsOptions রেফারেন্স দেখুন।

নির্দিষ্ট কলাম ইন্ডেক্স করা

আপনি AndroidSQLiteDriver ব্যবহার করলে এবং FTS3-, FTS4- বা FTS5-টেবিল-ব্যাকড এন্টিটি কাজ করে না এমন SDK ভার্সন ব্যবহার করলে, কোয়েরি দ্রুত করার জন্য আপনি এখনও ডেটাবেসে নির্দিষ্ট কলাম ইন্ডেক্স করতে পারবেন। আপনি BundledSQLiteDriver ব্যবহার করলে, Android SDK ভার্সন নির্বিশেষে, Room সব FTS ভার্সনে কাজ করে।

কোনও এন্টিটিতে ইন্ডেক্স যোগ করতে, @Entity অ্যানোটেশনে indices প্রপার্টি যোগ করুন। ইনডেক্স বা কম্পোজিট ইনডেক্সে অন্তর্ভুক্ত করার জন্য কলামের নাম তালিকাভুক্ত করুন। নিম্নলিখিত কোড স্নিপেট থেকে কীভাবে ইন্ডেক্স যোগ করতে হয় তা জানতে পারবেন:

@Entity(indices = [Index(value = ["last_name", "address"])])
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "first_name") val firstName: String,
    @ColumnInfo(name = "last_name") val lastName: String,
    val address: String?,
)

কখনও কখনও, ডেটাবেসের নির্দিষ্ট কলাম বা কলামের গ্রুপে অনন্য মান থাকতে হবে। এই অনন্যতা প্রয়োগ করতে, unique প্রপার্টি @Index অ্যানোটেশনকে true হিসেবে সেট করুন। নিচের কোড স্যাম্পেল থেকে কীভাবে এই অনন্যতা এনফোর্স করতে হয় তা জানতে পারবেন:

@Entity(indices = [Index(value = ["first_name", "last_name"], unique = true)])
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "first_name") val firstName: String,
    @ColumnInfo(name = "last_name") val lastName: String,
)