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

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

এর মানে হল যে আপনি কোনো SQL কোড না লিখে আপনার ডাটাবেস স্কিমা সংজ্ঞায়িত করতে রুম সত্তা ব্যবহার করতে পারেন।

একটি সত্তার শারীরস্থান

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

নিম্নলিখিত কোডটি একটি সাধারণ সত্তার একটি উদাহরণ যা আইডি, প্রথম নাম এবং শেষ নামের জন্য কলাম সহ একটি User টেবিল সংজ্ঞায়িত করে:

কোটলিন

@Entity
data class User(
    @PrimaryKey val id: Int,

    val firstName: String?,
    val lastName: String?
)

জাভা

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

    public String firstName;
    public String lastName;
}

ডিফল্টরূপে, রুম ডাটাবেস টেবিলের নাম হিসাবে ক্লাসের নাম ব্যবহার করে। আপনি যদি টেবিলের একটি ভিন্ন নাম চান, তাহলে @Entity টীকাটির tableName বৈশিষ্ট্য সেট করুন। একইভাবে, রুম ডিফল্টরূপে ডাটাবেসের কলামের নাম হিসাবে ক্ষেত্রের নাম ব্যবহার করে। আপনি যদি একটি কলামের একটি ভিন্ন নাম চান, তাহলে ক্ষেত্রে @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?
)

জাভা

@Entity(tableName = "users")
public class User {
    @PrimaryKey
    public int id;

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

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

একটি প্রাথমিক কী সংজ্ঞায়িত করুন

প্রতিটি রুম সত্তাকে অবশ্যই একটি প্রাথমিক কী সংজ্ঞায়িত করতে হবে যা সংশ্লিষ্ট ডাটাবেস টেবিলের প্রতিটি সারিকে স্বতন্ত্রভাবে সনাক্ত করে। এটি করার সবচেয়ে সহজ উপায় হল @PrimaryKey এর সাথে একটি একক কলাম টীকা করা:

কোটলিন

@PrimaryKey val id: Int

জাভা

@PrimaryKey
public int id;

একটি যৌগিক প্রাথমিক কী সংজ্ঞায়িত করুন

আপনার যদি একাধিক কলামের সংমিশ্রণ দ্বারা স্বতন্ত্রভাবে সনাক্ত করার জন্য একটি সত্তার উদাহরণের প্রয়োজন হয়, তাহলে আপনি @Entity এর primaryKeys বৈশিষ্ট্যে সেই কলামগুলি তালিকাভুক্ত করে একটি যৌগিক প্রাথমিক কী নির্ধারণ করতে পারেন:

কোটলিন

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

জাভা

@Entity(primaryKeys = {"firstName", "lastName"})
public class User {
    public String firstName;
    public String lastName;
}

ক্ষেত্রগুলি উপেক্ষা করুন

ডিফল্টরূপে, সত্তায় সংজ্ঞায়িত প্রতিটি ক্ষেত্রের জন্য রুম একটি কলাম তৈরি করে। যদি কোনো সত্তার এমন ক্ষেত্র থাকে যা আপনি টিকে থাকতে চান না, তাহলে আপনি @Ignore ব্যবহার করে সেগুলিকে টীকা করতে পারেন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

কোটলিন

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

জাভা

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

    public String firstName;
    public String lastName;

    @Ignore
    Bitmap picture;
}

যে ক্ষেত্রে একটি সত্তা একটি অভিভাবক সত্তা থেকে ক্ষেত্রগুলিকে উত্তরাধিকারী করে, সাধারণত @Entity অ্যাট্রিবিউটের ignoredColumns সম্পত্তি ব্যবহার করা সহজ:

কোটলিন

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

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

জাভা

@Entity(ignoredColumns = "picture")
public class RemoteUser extends User {
    @PrimaryKey
    public int id;

    public boolean hasVpn;
}

রুম বিভিন্ন ধরণের টীকা সমর্থন করে যা আপনার জন্য আপনার ডাটাবেসের টেবিলে বিশদ অনুসন্ধান করা সহজ করে তোলে। আপনার অ্যাপের minSdkVersion 16-এর কম না হলে পূর্ণ-পাঠ্য অনুসন্ধান ব্যবহার করুন।

পূর্ণ-পাঠ্য অনুসন্ধান সমর্থন

আপনার অ্যাপের যদি ফুল-টেক্সট সার্চ (FTS) এর মাধ্যমে ডাটাবেস তথ্যে খুব দ্রুত অ্যাক্সেসের প্রয়োজন হয়, তাহলে আপনার সত্তাগুলিকে একটি ভার্চুয়াল টেবিল দ্বারা ব্যাক করুন যা FTS3 বা FTS4 SQLite এক্সটেনশন মডিউল ব্যবহার করে৷ রুম 2.1.0 এবং উচ্চতর এ উপলব্ধ এই ক্ষমতাটি ব্যবহার করতে, একটি প্রদত্ত সত্তাতে @Fts3 বা @Fts4 টীকা যোগ করুন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:

কোটলিন

// Use `@Fts3` only if your app has strict disk space requirements or if you
// require compatibility with an older SQLite version.
@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 use this type and column name. */
    @PrimaryKey @ColumnInfo(name = "rowid") val id: Int,
    @ColumnInfo(name = "first_name") val firstName: String?
)

জাভা

// Use `@Fts3` only if your app has strict disk space requirements or if you
// require compatibility with an older SQLite version.
@Fts4
@Entity(tableName = "users")
public class User {
    // Specifying a primary key for an FTS-table-backed entity is optional, but
    // if you include one, it must use this type and column name.
    @PrimaryKey
    @ColumnInfo(name = "rowid")
    public int id;

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

যে ক্ষেত্রে একটি টেবিল একাধিক ভাষায় সামগ্রী সমর্থন করে, প্রতিটি সারির জন্য ভাষা তথ্য সংরক্ষণ করে এমন কলামটি নির্দিষ্ট করতে languageId বিকল্পটি ব্যবহার করুন:

কোটলিন

@Fts4(languageId = "lid")
@Entity(tableName = "users")
data class User(
    // ...
    @ColumnInfo(name = "lid") val languageId: Int
)

জাভা

@Fts4(languageId = "lid")
@Entity(tableName = "users")
public class User {
    // ...

    @ColumnInfo(name = "lid")
    int languageId;
}

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

সূচী নির্দিষ্ট কলাম

যদি আপনার অ্যাপটি অবশ্যই SDK সংস্করণগুলিকে সমর্থন করে যা FTS3- বা FTS4-টেবিল-সমর্থিত সত্তা সমর্থন করে না, আপনি এখনও আপনার প্রশ্নের গতি বাড়ানোর জন্য ডাটাবেসের নির্দিষ্ট কলামগুলিকে ইন্ডেক্স করতে পারেন৷ একটি সত্তায় সূচক যোগ করতে, @Entity টীকা-এর মধ্যে indices সম্পত্তি অন্তর্ভুক্ত করুন, আপনি যে কলামগুলিকে সূচী বা যৌগিক সূচকে অন্তর্ভুক্ত করতে চান তার নাম তালিকাভুক্ত করুন। নিম্নলিখিত কোড স্নিপেট এই টীকা প্রক্রিয়া প্রদর্শন করে:

কোটলিন

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

জাভা

@Entity(indices = {@Index("name"),
        @Index(value = {"last_name", "address"})})
public class User {
    @PrimaryKey
    public int id;

    public String firstName;
    public String address;

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

    @Ignore
    Bitmap picture;
}

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

কোটলিন

@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?,
    @Ignore var picture: Bitmap?
)

জাভা

@Entity(indices = {@Index(value = {"first_name", "last_name"},
        unique = true)})
public class User {
    @PrimaryKey
    public int id;

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

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

    @Ignore
    Bitmap picture;
}

AutoValue-ভিত্তিক অবজেক্ট অন্তর্ভুক্ত করুন

রুম 2.1.0 এবং উচ্চতর, আপনি Java-ভিত্তিক অপরিবর্তনীয় মান ক্লাসগুলি ব্যবহার করতে পারেন, যা আপনি @AutoValue ব্যবহার করে টীকা করেন, আপনার অ্যাপের ডাটাবেসের সত্তা হিসাবে৷ এই সমর্থনটি বিশেষভাবে সহায়ক যখন একটি সত্তার দুটি দৃষ্টান্ত সমান বলে বিবেচিত হয় যদি তাদের কলামে অভিন্ন মান থাকে।

সত্তা হিসাবে @AutoValue এর সাথে টীকাযুক্ত ক্লাসগুলি ব্যবহার করার সময়, আপনি @PrimaryKey , @ColumnInfo , @Embedded এবং @Relation ব্যবহার করে ক্লাসের বিমূর্ত পদ্ধতিগুলিকে টীকা করতে পারেন। এই টীকাগুলি ব্যবহার করার সময়, যাইহোক, আপনাকে অবশ্যই প্রতিবার @CopyAnnotations টীকা অন্তর্ভুক্ত করতে হবে যাতে রুম পদ্ধতিগুলির স্বয়ংক্রিয়-উত্পাদিত বাস্তবায়নকে সঠিকভাবে ব্যাখ্যা করতে পারে।

নিম্নলিখিত কোড স্নিপেটটি @AutoValue এর সাথে টীকাযুক্ত একটি ক্লাসের একটি উদাহরণ দেখায় যা রুম একটি সত্তা হিসাবে স্বীকৃতি দেয়:

User.java

@AutoValue
@Entity
public abstract class User {
    // Supported annotations must include `@CopyAnnotations`.
    @CopyAnnotations
    @PrimaryKey
    public abstract long getId();

    public abstract String getFirstName();
    public abstract String getLastName();

    // Room uses this factory method to create User objects.
    public static User create(long id, String firstName, String lastName) {
        return new AutoValue_User(id, firstName, lastName);
    }
}