যখন আপনি আপনার অ্যাপের ডেটা সংরক্ষণের জন্য Room পার্সিস্টেন্স লাইব্রেরি ব্যবহার করেন, তখন আপনি যে অবজেক্টগুলো সংরক্ষণ করতে চান সেগুলোকে উপস্থাপন করার জন্য এনটিটি (entity) সংজ্ঞায়িত করেন। প্রতিটি এনটিটি সংশ্লিষ্ট Room ডেটাবেসের একটি টেবিলের সাথে সঙ্গতিপূর্ণ থাকে, এবং একটি এনটিটির প্রতিটি ইনস্ট্যান্স সেই সংশ্লিষ্ট টেবিলের একটি ডেটা সারিকে প্রতিনিধিত্ব করে।
Room এনটিটি ব্যবহার করে আপনি কোনো SQL কোড না লিখেই আপনার ডাটাবেস স্কিমা নির্ধারণ করতে পারেন।
একটি সত্তার গঠন
আপনি প্রতিটি Room এনটিটিকে @Entity অ্যানোটেশনযুক্ত একটি ক্লাস হিসেবে সংজ্ঞায়িত করেন। একটি Room এনটিটিতে ডাটাবেসের সংশ্লিষ্ট টেবিলের প্রতিটি কলামের জন্য প্রোপার্টি অন্তর্ভুক্ত থাকে, যার মধ্যে প্রাইমারি কী গঠনকারী এক বা একাধিক কলামও থাকে।
নিম্নলিখিত কোডটি এমন একটি এনটিটির উদাহরণ যা আইডি, প্রথম নাম এবং শেষ নামের কলাম সহ একটি 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 )
Room, FTS-সমর্থিত এনটিটি সংজ্ঞায়িত করার জন্য আরও বেশ কিছু বিকল্প প্রদান করে, যার মধ্যে রয়েছে ফলাফলের ক্রমবিন্যাস, কলাম থেকে ইনডেক্স অপসারণ এবং টেবিলকে এক্সটার্নাল কন্টেন্ট হিসেবে পরিচালনা করা। এই বিকল্পগুলো সম্পর্কে আরও তথ্যের জন্য, FtsOptions রেফারেন্সটি দেখুন।
সূচক নির্দিষ্ট কলাম
আপনি যদি AndroidSQLiteDriver ব্যবহার করেন এবং এমন SDK সংস্করণ সমর্থন করতে চান যা FTS3-, FTS4-, বা FTS5-টেবিল-ভিত্তিক এনটিটি সমর্থন করে না, তাহলেও আপনি আপনার কোয়েরির গতি বাড়ানোর জন্য ডাটাবেসের নির্দিষ্ট কিছু কলাম ইনডেক্স করতে পারেন। আপনি যদি BundledSQLiteDriver ব্যবহার করেন, তাহলে Room অ্যান্ড্রয়েড SDK সংস্করণ নির্বিশেষে সমস্ত 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?, )
কখনও কখনও, একটি ডাটাবেসের নির্দিষ্ট কলাম বা কলামের গ্রুপে অনন্য মান থাকার প্রয়োজন হয়। এই অনন্যতা নিশ্চিত করতে, @Index অ্যানোটেশনের unique প্রপার্টিটি 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, )