आइए देखें कि कैसे @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बिल्कुल, जॉइन के साथ क्वेरी लिखें जैसे आपने कोशिश की है। लेकिन फिर आपको कोड में मैन्युअल रूप से परिणाम को आवश्यक रूप में बदलना चाहिए (लूपिंग परिणाम और सूची बनाना)।