आइए देखें कि कैसे @Relation
काम करता है। दो चरण हैं:
- कक्ष आपके द्वारा
@Query
में डाली गई क्वेरी को निष्पादित करता है उपयोगकर्ताओं को प्राप्त करने के लिए। हमेशा की तरह उस क्वेरी में कोई जॉइन शामिल नहीं है। इस क्वेरी का उपयोग डेटा के उस भाग को प्राप्त करने के लिए किया जाता है जो मुख्य तालिका (User
. में बना रहता है आपके मामले में)। - कक्ष एक और क्वेरी निष्पादित करता है। उसके लिए यह
@Relation
को देखता है पैरामीटर और समझता है कि इसे आगे किस तालिका में क्वेरी करनी चाहिए (Record
आपके मामले में) और उपयोगकर्ता के परिणाम के साथ जुड़ने की स्थिति क्या होनी चाहिए। यह महत्वपूर्ण है कि आपके पास इस क्वेरी बनाने की प्रक्रिया में दखल देने का कोई रास्ता नहीं है। आपRecord
पर फ़िल्टर सेट नहीं कर सकते हैं के क्षेत्र, उदाहरण के लिए। परिणाम प्राप्त करना कक्ष इसे आवश्यक प्रारूप में बदल देता है (Records
की सूची भरता है )।
आपके पास विकल्प हैं:
Records
पर फ़िल्टर सेट करने के संबंध में बदलाव करने के लिए तालिका (लेकिन इसके साथ आपको सूची के बिना फ्लैट डेटा मिलेगा)।
public class UserWithRecords {
@Embedded
protected Record record;
@Relation(
parentColumn = "user_id",
entity = User.class,
entityColumn = "id"
)
protected User user;
}
और क्वेरी को इसमें बदलने के लिए:
@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
- उपयोग नहीं करने के लिए
@Relation
बिल्कुल, जॉइन के साथ क्वेरी लिखें जैसे आपने कोशिश की है। लेकिन फिर आपको कोड में मैन्युअल रूप से परिणाम को आवश्यक रूप में बदलना चाहिए (लूपिंग परिणाम और सूची बनाना)।