दो इकाइयों के बीच एक-से-एक संबंध ऐसा संबंध होता है जिसमें पैरंट इकाई का हर इंस्टेंस, चाइल्ड इकाई के सिर्फ़ एक इंस्टेंस से मेल खाता है. साथ ही, इसका उल्टा भी सही होता है.
उदाहरण के लिए, संगीत स्ट्रीम करने वाले किसी ऐसे ऐप्लिकेशन पर विचार करें जहां उपयोगकर्ता के पास गानों की एक लाइब्रेरी है. हर उपयोगकर्ता के पास सिर्फ़ एक लाइब्रेरी होती है. साथ ही, हर लाइब्रेरी सिर्फ़ एक उपयोगकर्ता से जुड़ी होती है. इसलिए, User इकाई और Library इकाई के बीच वन-टू-वन रिलेशनशिप होता है.
अपने डेटाबेस में एक-से-एक संबंध तय करने और उनके बारे में क्वेरी करने के लिए, यह तरीका अपनाएं:
- रिलेशनशिप तय करना: दोनों इकाइयों के लिए क्लास बनाएं. साथ ही, यह पक्का करें कि एक इकाई, दूसरी इकाई के प्राइमरी कुंजी को रेफ़रंस के तौर पर इस्तेमाल करे.
- इकाइयों से क्वेरी करना: नई डेटा क्लास में संबंध को मॉडल करें और उससे जुड़ा डेटा वापस पाने के लिए एक फ़ंक्शन बनाएं.
संबंध तय करना
एक-से-एक संबंध तय करने के लिए, पहले अपनी दोनों इकाइयों के लिए एक क्लास बनाएं. किसी एक इकाई में ऐसा वैरिएबल शामिल होना चाहिए जो दूसरी इकाई की प्राइमरी कुंजी का रेफ़रंस देता हो.
@Entity data class User( @PrimaryKey val userId: Long, val name: String, val age: Int ) @Entity data class Library( @PrimaryKey val libraryId: Long, val userOwnerId: Long )
इकाइयों के बारे में क्वेरी करना
उपयोगकर्ताओं और उनसे जुड़ी लाइब्रेरी की सूची के बारे में क्वेरी करने के लिए, आपको पहले दोनों इकाइयों के बीच एक-से-एक संबंध मॉडल करना होगा.
रिलेशनशिप को मॉडल करने के लिए, एक नई डेटा क्लास बनाएं. इसमें हर इंस्टेंस, पैरंट इकाई और उससे जुड़ी चाइल्ड इकाई का इंस्टेंस रखता है. चाइल्ड इकाई में @Relation एनोटेशन जोड़ें. parentColumns को पैरंट इकाई के प्राइमरी कुंजी कॉलम के नाम पर सेट करें. साथ ही, entityColumns को चाइल्ड इकाई के उस कॉलम के नाम पर सेट करें जो पैरंट की प्राइमरी कुंजी को रेफ़रंस करता है.
data class UserAndLibrary( @Embedded val user: User, @Relation( parentColumns = ["userId"], entityColumns = ["userOwnerId"] ) val library: Library )
आखिर में, डेटा ऐक्सेस ऑब्जेक्ट (डीएओ) क्लास में एक ऐसा फ़ंक्शन जोड़ें जो डेटा क्लास के उन सभी इंस्टेंस को दिखाता हो जिनमें पैरंट इकाई को चाइल्ड इकाई के साथ जोड़ा गया हो. @Transaction एनोटेशन जोड़ें, ताकि Room पूरे ऑपरेशन को एटॉमिक तरीके से पूरा कर सके. ऐसा इसलिए, क्योंकि इस फ़ंक्शन को दो क्वेरी चलाने के लिए Room की ज़रूरत होती है.
@Transaction @Query("SELECT * FROM User") suspend fun getUsersAndLibraries(): List<UserAndLibrary>
कंपोज़िट कुंजियां
अगर कंपोज़िट कुंजियों का इस्तेमाल करके रिलेशनशिप तय की जाती है, तो parentColumns और entityColumns में एक से ज़्यादा कॉलम तय करें. parentColumns में कॉलम का क्रम, entityColumns में कॉलम के क्रम से मेल खाना चाहिए.
@Entity(primaryKeys = ["firstName", "lastName"]) data class User( val firstName: String, val lastName: String, val age: Int ) @Entity data class Library( @PrimaryKey val libraryId: Long, val userFirstName: String, val userLastName: String ) data class UserAndLibrary( @Embedded val user: User, @Relation( parentColumns = ["firstName", "lastName"], entityColumns = ["userFirstName", "userLastName"] ) val library: Library )