रूम की इकाइयों का इस्तेमाल करके, डेटा तय करें

जब रूम परसिस्टेंस लाइब्रेरी का इस्तेमाल इन कामों के लिए किया जाता है ऐप्लिकेशन का डेटा स्टोर करते हैं, तो आप उन ऑब्जेक्ट को दर्शाने के लिए इकाइयां तय करते हैं जिन्हें आप को सेव करना है. हर इकाई, जुड़े हुए रूम में किसी टेबल से जुड़ी होती है है और इकाई का हर इंस्टेंस, डेटाबेस में डेटा की एक लाइन दिखाता है संबंधित टेबल.

इसका मतलब है कि अपने डेटाबेस को तय करने के लिए रूम इकाइयों का इस्तेमाल किया जा सकता है स्कीमा के बिना तो मुझे एसक्यूएल कोड डालना होगा.

किसी एलिमेंट की बनावट

रूम की हर इकाई, एक ऐसी क्लास के तौर पर तय होती है जिसके साथ एनोटेट किया गया है @Entity. रूम की इकाई में ये शामिल हैं डेटाबेस की संबंधित टेबल में हर कॉलम के लिए फ़ील्ड. इसमें एक फ़ील्ड भी शामिल होता है प्राइमरी पासकोड बनाने वाले ज़्यादा कॉलम.

नीचे दिया गया कोड, एक सामान्य इकाई का उदाहरण है, जो User टेबल को तय करता है नाम: आईडी, नाम, और सरनेम के कॉलम होने चाहिए:

Kotlin

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

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

Java

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

    public String firstName;
    public String lastName;
}

डिफ़ॉल्ट रूप से, रूम क्लास के नाम का इस्तेमाल, डेटाबेस टेबल के नाम के तौर पर करता है. अगर आपको अगर आपको टेबल को कोई दूसरा नाम देना है, तो tableName प्रॉपर्टी @Entity एनोटेशन. इसी तरह, रूम, फ़ील्ड के नामों का इस्तेमाल कॉलम के नामों के तौर पर करता है डिफ़ॉल्ट रूप से डेटाबेस. अगर आप किसी कॉलम को अलग नाम देना चाहते हैं, तो @ColumnInfo फ़ील्ड में लिखकर name सेट करें प्रॉपर्टी. नीचे दिए गए उदाहरण में टेबल और उसके कॉलम के लिए पसंद के मुताबिक नाम दिए गए हैं:

Kotlin

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

Java

@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:

Kotlin

@PrimaryKey val id: Int

Java

@PrimaryKey
public int id;

कंपोज़िट प्राइमरी पासकोड तय करना

अगर आपको किसी इकाई के इंस्टेंस की पहचान करनी है, तो एक से ज़्यादा कॉलम में, वैल्यू के तौर पर कंपोज़िट प्राइमरी कुंजी तय की जा सकती है, तो कॉलम में इसकी primaryKeys प्रॉपर्टी @Entity:

Kotlin

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

Java

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

फ़ील्ड को अनदेखा करें

डिफ़ॉल्ट रूप से, रूम, इकाई में तय किए गए हर फ़ील्ड के लिए एक कॉलम बनाता है. अगर किसी इकाई में ऐसे फ़ील्ड हैं जिन्हें आपको सेव करके नहीं रखना है, तो उनके बारे में जानकारी दी जा सकती है @Ignore का इस्तेमाल इस तरह किया जा रहा है निम्न कोड स्निपेट में दिखाया गया है:

Kotlin

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

Java

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

    public String firstName;
    public String lastName;

    @Ignore
    Bitmap picture;
}

जिन मामलों में कोई इकाई, पैरंट इकाई से फ़ील्ड इनहेरिट करती है वहां आम तौर पर इस्तेमाल करने में आसान इसकी ignoredColumns प्रॉपर्टी @Entity एट्रिब्यूट:

Kotlin

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

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

Java

@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 एनोटेशन, जैसा कि दिखाया गया है कोड स्निपेट में:

Kotlin

// 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?
)

Java

// 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 विकल्प जिसमें भाषा की जानकारी सेव की जाती है हर पंक्ति:

Kotlin

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

Java

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

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

रूम में, एफ़टीएस-बैक्ड इकाइयों के बारे में बताने के लिए, कई अन्य विकल्प भी शामिल हैं. जैसे: नतीजे का क्रम, टोकनाइज़र टाइप, और टेबल को बाहरी कॉन्टेंट के तौर पर मैनेज किया जा सकता है. इसके लिए इन विकल्पों के बारे में ज़्यादा जानने के लिए, FtsOptions रेफ़रंस.

इंडेक्स खास कॉलम

अगर आपके ऐप्लिकेशन में SDK टूल के ऐसे वर्शन काम करते हैं जो FTS3- या FTS4-टेबल पर आधारित इकाइयां, तो आप अब भी डेटाबेस में कुछ कॉलम इंडेक्स कर सकते हैं आपकी क्वेरी को तेज़ किया जा सकता है. किसी इकाई में इंडेक्स जोड़ने के लिए, indices प्रॉपर्टी @Entity एनोटेशन, सूची में शामिल किए जाने वाले कॉलम के नाम डालें या कंपोज़िट इंडेक्स. यह कोड स्निपेट इस एनोटेशन को दिखाता है प्रक्रिया:

Kotlin

@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?
)

Java

@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;
}

कभी-कभी, डेटाबेस में कुछ फ़ील्ड या फ़ील्ड के ग्रुप यूनीक होने चाहिए. आप इस खास प्रॉपर्टी को लागू करने के लिए, unique @Index की प्रॉपर्टी true के लिए एनोटेशन. नीचे दिया गया कोड सैंपल किसी टेबल को दो पंक्तियां जिनमें firstName और lastName कॉलम:

Kotlin

@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?
)

Java

@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);
    }
}