एक-एक संबंधों को तय करना और उनसे जुड़ी क्वेरी करना

दो एंटिटी के बीच वन-टू-वन रिलेशनशिप का मतलब है कि पैरंट एंटिटी के हर इंस्टेंस के लिए, चाइल्ड एंटिटी का सिर्फ़ एक इंस्टेंस होता है. साथ ही, इसका उल्टा भी सही है.

उदाहरण के लिए, संगीत स्ट्रीमिंग ऐप्लिकेशन पर विचार करें. इसमें उपयोगकर्ता के पास गानों की एक लाइब्रेरी होती है. हर उपयोगकर्ता के पास सिर्फ़ एक लाइब्रेरी होती है और हर लाइब्रेरी, सिर्फ़ एक उपयोगकर्ता से जुड़ी होती है. इसलिए, User एंटिटी और Library एंटिटी के बीच वन-टू-वन रिलेशनशिप होता है.

अपने डेटाबेस में वन-टू-वन रिलेशनशिप तय करने और उनके बारे में क्वेरी करने के लिए, यह तरीका अपनाएं:

  1. रिलेशनशिप तय करना: दोनों एंटिटी के लिए क्लास बनाएं, साथ ही, यह पक्का करें कि एक क्लास, दूसरी क्लास की प्राइमरी कुंजी को रेफ़र करे.
  2. एंटिटी के बारे में क्वेरी करना: एक नई डेटा क्लास में रिलेशनशिप को मॉडल करें और उससे जुड़ा डेटा पाने के लिए एक तरीका बनाएं.

रिलेशनशिप तय करना

वन-टू-वन रिलेशनशिप तय करने के लिए, सबसे पहले अपनी दोनों एंटिटी के लिए एक-एक क्लास बनाएं. इनमें से किसी एक एंटिटी में, ऐसा वैरिएबल शामिल होना चाहिए जो दूसरी एंटिटी की प्राइमरी कुंजी को रेफ़र करता हो.

Kotlin

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

Java

@Entity
public class User {
    @PrimaryKey public long userId;
    public String name;
    public int age;
}

@Entity
public class Library {
    @PrimaryKey public long libraryId;
    public long userOwnerId;
}

एंटिटी के बारे में क्वेरी करना

उपयोगकर्ताओं की सूची और उनसे जुड़ी लाइब्रेरी के बारे में क्वेरी करने के लिए, आपको सबसे पहले दोनों एंटिटी के बीच वन-टू-वन रिलेशनशिप को मॉडल करना होगा.

इसके लिए, एक नई डेटा क्लास बनाएं. इसमें हर इंस्टेंस, पैरंट एंटिटी का एक इंस्टेंस और चाइल्ड एंटिटी का उससे जुड़ा इंस्टेंस रखता है. चाइल्ड एंटिटी के इंस्टेंस में @Relation एनोटेशन जोड़ें. साथ ही, parentColumn को पैरंट एंटिटी की प्राइमरी कुंजी वाले कॉलम के नाम पर और entityColumn को चाइल्ड एंटिटी के उस कॉलम के नाम पर सेट करें जो पैरंट एंटिटी की प्राइमरी कुंजी को रेफ़र करता है.

Kotlin

data class UserAndLibrary(
    @Embedded val user: User,
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    val library: Library
)

Java

public class UserAndLibrary {
    @Embedded public User user;
    @Relation(
         parentColumn = "userId",
         entityColumn = "userOwnerId"
    )
    public Library library;
}

आखिर में, DAO क्लास में एक ऐसा तरीका जोड़ें जो डेटा क्लास के उन सभी इंस्टेंस को दिखाता है जिनमें पैरंट एंटिटी और चाइल्ड एंटिटी को पेयर किया गया है. इस तरीके के लिए, Room को दो क्वेरी चलाने की ज़रूरत होती है. इसलिए, आपको इस तरीके में @Transaction एनोटेशन जोड़ना चाहिए. इससे यह पक्का होता है कि पूरा ऑपरेशन, एटॉमिक तरीके से चलता है.

Kotlin

@Transaction
@Query("SELECT * FROM User")
fun getUsersAndLibraries(): List<UserAndLibrary>

Java

@Transaction
@Query("SELECT * FROM User")
public List<UserAndLibrary> getUsersAndLibraries();