दो एंटिटी के बीच एक-से-ज़्यादा का संबंध तब होता है, जब पैरंट एंटिटी के हर इंस्टेंस के लिए, चाइल्ड एंटिटी के शून्य या उससे ज़्यादा इंस्टेंस मौजूद हों. हालांकि, चाइल्ड एंटिटी का हर इंस्टेंस, पैरंट एंटिटी के सिर्फ़ एक इंस्टेंस से जुड़ा हो सकता है.
म्यूज़िक स्ट्रीमिंग ऐप्लिकेशन के उदाहरण में, मान लें कि उपयोगकर्ता के पास अपने गानों को प्लेलिस्ट में व्यवस्थित करने की सुविधा है. हर उपयोगकर्ता, अपनी पसंद के मुताबिक जितनी चाहे उतनी प्लेलिस्ट बना सकता है. हालांकि, हर प्लेलिस्ट को सिर्फ़ एक उपयोगकर्ता बनाता है. इसलिए, User एंटिटी और Playlist एंटिटी के बीच एक-से-ज़्यादा का संबंध होता है.
अपने डेटाबेस में एक-से-ज़्यादा के संबंध तय करने और उनके बारे में क्वेरी करने के लिए, यह तरीका अपनाएं:
- संबंध तय करना: दोनों एंटिटी के लिए क्लास बनाएं, इसमें चाइल्ड एंटिटी, पैरंट की प्राइमरी कुंजी को रेफ़र करती है.
- एंटिटी के बारे में क्वेरी करना: नए डेटा क्लास में संबंध को मॉडल करें और उससे जुड़ा डेटा पाने के लिए, एक तरीका लागू करें.
संबंध तय करना
एक-से-ज़्यादा का संबंध तय करने के लिए, सबसे पहले दोनों एंटिटी के लिए एक क्लास बनाएं. एक-से-एक के संबंध की तरह, चाइल्ड एंटिटी में एक ऐसा वैरिएबल शामिल होना चाहिए जो पैरंट एंटिटी की प्राइमरी कुंजी का रेफ़रंस हो.
Kotlin
@Entity
data class User(
@PrimaryKey val userId: Long,
val name: String,
val age: Int
)
@Entity
data class Playlist(
@PrimaryKey val playlistId: Long,
val userCreatorId: Long,
val playlistName: String
)
Java
@Entity
public class User {
@PrimaryKey public long userId;
public String name;
public int age;
}
@Entity
public class Playlist {
@PrimaryKey public long playlistId;
public long userCreatorId;
public String playlistName;
}
एंटिटी के बारे में क्वेरी करना
उपयोगकर्ताओं की सूची और उनसे जुड़ी प्लेलिस्ट के बारे में क्वेरी करने के लिए, आपको सबसे पहले दोनों एंटिटी के बीच एक-से-ज़्यादा के संबंध को मॉडल करना होगा
इसके लिए, एक नया डेटा क्लास बनाएं. इसमें हर इंस्टेंस, पैरंट एंटिटी का एक इंस्टेंस और उससे जुड़े सभी चाइल्ड एंटिटी इंस्टेंस की सूची रखता है. चाइल्ड एंटिटी के इंस्टेंस में
@Relation एनोटेशन जोड़ें. इसमें
parentColumn को पैरंट
एंटिटी की प्राइमरी कुंजी वाले कॉलम के नाम पर सेट करें और entityColumn को चाइल्ड एंटिटी
के उस कॉलम के नाम पर सेट करें जो पैरंट एंटिटी की प्राइमरी कुंजी को रेफ़र करता है.
Kotlin
data class UserWithPlaylists(
@Embedded val user: User,
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
val playlists: List<Playlist>
)
Java
public class UserWithPlaylists {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userCreatorId"
)
public List<Playlist> playlists;
}
आखिर में, DAO क्लास में एक ऐसा तरीका जोड़ें जो डेटा क्लास के उन सभी इंस्टेंस को दिखाता है जिनमें पैरंट एंटिटी और चाइल्ड एंटिटी की जानकारी होती है. इस तरीके के लिए,
Room को दो क्वेरी चलाने की ज़रूरत होती है. इसलिए, इस
तरीके में @Transaction एनोटेशन जोड़ें, ताकि पूरी कार्रवाई एक साथ की जा सके.
Kotlin
@Transaction
@Query("SELECT * FROM User")
fun getUsersWithPlaylists(): List<UserWithPlaylists>
Java
@Transaction
@Query("SELECT * FROM User")
public List<UserWithPlaylists> getUsersWithPlaylists();