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

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

Room की इकाइयों का इस्तेमाल करके, एसक्यूएल कोड लिखे बिना ही डेटाबेस स्कीमा तय किया जा सकता है.

किसी इकाई की बनावट

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

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

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

डिफ़ॉल्ट रूप से, रूम क्लास के नाम का इस्तेमाल, डेटाबेस टेबल के नाम के तौर पर करता है. अगर आपको टेबल को कोई अलग नाम देना है, तो @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 में कई एनोटेशन काम करते हैं. इनकी मदद से, डेटाबेस टेबल में मौजूद जानकारी खोजी जा सकती है.

पूरे टेक्स्ट को खोजने की सुविधा

अगर आपके ऐप्लिकेशन को फ़ुल-टेक्स्ट सर्च (एफ़टीएस) की सुविधा की ज़रूरत है, तो अपनी इकाइयों का बैक अप वर्चुअल टेबल की मदद से लें. 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, Android 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,
)