2017-06-24 12 views
6

असल में, दो चीजें हैं जिन्हें मैं समझ नहीं पा रहा हूं: ऑब्जेक्ट्स और ऑब्जेक्ट्स के साथ ऑब्जेक्ट्स की सूचियांएंड्रॉइड रूम में ऑब्जेक्ट्स कैसे स्टोर करें?

कहें कि मुझे सर्वर से ऑब्जेक्ट्स की एक सूची प्राप्त होती है। उनमें से प्रत्येक इस तरह दिखता है:

@Entity 
public class BigObject { 
    @PrimaryKey 
    private int id; 
    private User user; 
    private List<SmallObject> smallObjects; 
} 
क्षेत्रों के रूप में इन दोनों वस्तुओं के साथ

:

@Entity 
public class User { 
    @PrimaryKey 
    private int id; 
    private String name; 
    @TypeConverters(GenderConverter.class) 
    public MyEnums.Gender gender; 
} 

@Entity 
public class SmallObject { 
    @PrimaryKey (autoGenerate = true) 
    private int id; 
    private String smallValue; 
} 

वे इस तुलना में अधिक जटिल है, इसलिए के रूप में कमरे का पता चलता है मैं @TypeConverters का उपयोग नहीं कर सकते हैं:

error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. 

मैं इस डेटा संरचना को कमरे में कैसे स्टोर करूं?

+1

आम तौर पर, संस्थाएं व्यक्तिगत रूप से या सूचियों के रूप में, अन्य इकाइयों को कमरे में नहीं रखती हैं। वे अन्य संस्थाओं को * विदेशी कुंजी * पकड़ सकते हैं। और एक दृश्य मॉडल की तरह अन्य संरचनाएं, जो भी इकाइयों की आवश्यकता होती है, पकड़ सकते हैं। तो, '' BigObject' smallObjects' से छुटकारा और 'एक विदेशी कुंजी के रूप में userId' साथ user' की जगह' पाने के लिए की जरूरत है। 'उपयोगकर्ता' और 'SmallObject' के पास' BigObject' पर विदेशी कुंजी वापस होंगी। फिर, एक दृश्य मॉडल या कुछ है कि आप से पॉप्युलेट '@ Query' डीएओ तरीकों कि' BigObject', इससे संबंधित 'User', और इससे संबंधित' SmallObjects' को पुन: प्राप्त की स्थापना की। – CommonsWare

उत्तर

15

मुझे लगता है कि जवाब देने के लिए सबसे अच्छा तरीका यह भंडारण संरचनाओं में एक संक्षिप्त सिंहावलोकन है ...

सूचियाँ

कक्ष भंडारण सूचियों कि एक POJO के अंदर नेस्टेड का समर्थन नहीं करता। सूचियों को स्टोर करने का अनुशंसित तरीका विदेशी कुंजी दृष्टिकोण का उपयोग करना है। ऑब्जेक्ट्स की सूची को एक अलग तालिका में संग्रहित करें (इस मामले में एक छोटी ऑब्जेक्ट्स तालिका) उनके संबंधित मूल ऑब्जेक्ट (इस मामले में "big_object_id") के लिए एक विदेशी कुंजी के साथ। यह कुछ इस तरह देखना चाहिए ...

@Entity 
public class BigObject { 
    @PrimaryKey 
    private int id; 
    private User user; 
    @Ignore 
    private List<SmallObject> smallObjects; 
} 

@Entity(foreignKeys = { 
      @ForeignKey(
       entity = BigObject.class, 
       parentColumns = "id", 
       childColumns = "big_object_fk" 
      )}) 
public class SmallObject { 
    @PrimaryKey (autoGenerate = true) 
    private int id; 
    private String smallValue; 
    @ColumnInfo(name = "big_object_fk") 
    private int bigObjectIdFk 
} 

ध्यान दें कि हम List<SmallObject> को @Ignore annotaiton जोड़ लिया है के रूप में हम कमरे में दृढ़ता के दौरान क्षेत्र की अनदेखी करने के (के रूप में सूचियां समर्थित नहीं हैं) चाहते हैं। अब यह अस्तित्व में है कि जब हम डीबी से संबंधित छोटी वस्तुओं की हमारी सूची का अनुरोध करते हैं तो भी हम उन्हें पीओजेओ में स्टोर कर सकते हैं।

मेरे ज्ञान के लिए इसका मतलब यह होगा कि आप दो प्रश्न बना रहे हैं।

BigObject b = db.BigObjectDao.findById(bOId); 
List<SmallObject> s = db.smallObjectDao.findAllSOforBO(bOId); 
b.setsmallObjects(s); 

ऐसा प्रतीत होता है एक छोटी हाथ @Relation

प्रकार कन्वर्टर्स

इन मामलों में आप किसी जटिल डेटा संरचना है कि बिना flattend किया जा सकता है के लिए कर रहे हैं के रूप में इस के लिए है कि वहाँ जानकारी खोना, और एक कॉलम में संग्रहीत। इसका एक अच्छा उदाहरण दिनांक वस्तु है। एक तिथि ऑब्जेक्ट जटिल है और इसमें बहुत सारे मूल्य हैं, इसलिए डेटाबेस में इसे संग्रहीत करना मुश्किल है। हम डेट ऑब्जेक्ट के मिली प्रस्तुति को निकालने और स्टोर करने के लिए एक प्रकार कनवर्टर का उपयोग करते हैं। इसके बाद हम मिलिस को एक तिथि ऑब्जेक्ट में परिवर्तित करते हैं जिससे हमारे डेटा को बरकरार रखा जाता है।

यह है जब आप अपने माता-पिता POJO में सभी नेस्टेड POJOs के क्षेत्रों लेने के लिए और एक तालिका में स्टोर करने के लिए उन्हें बाहर समतल करना चाहते हैं प्रयोग किया जाता है एंबेडेड। एक उदाहरण:

- name 
- age 
- location_x 
- location_y 
- DOB 

भावना एंबेडेड में हर नेस्ट उद्देश्य यह है कि प्राथमिक शामिल के लिए आप समय बनाने प्रकार कन्वर्टर्स को बचाने के लिए मौजूद है:

- name 
- age 
- location 
    - x 
    - y 
- DOB 

..when इस संरचना एम्बेडेड के रूप में डेटाबेस में संग्रहीत किया जाएगा स्ट्रिंग, int, float, आदि जैसे फ़ील्ड टाइप करें ...

+0

एंबेडेड डॉक्स: https://developer.android.com/reference/android/arch/persistence/room/Embedded.html – DeaMon1

संबंधित मुद्दे