एक-से-कई रिलेशनशिप तय करना और उनसे जुड़ी क्वेरी करना

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

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

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

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

संबंध तय करना

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

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();