2012-10-02 23 views
27

अगर मैं अपने स्पष्टीकरण के साथ स्पष्ट नहीं हूं तो मैं क्षमा चाहता हूं लेकिन अनुरोध किए जाने पर मैं स्पष्टता के लिए इस प्रश्न को जोड़ और संपादित कर दूंगा।विदेशी कोलेक्शन को ArrayList में कनवर्ट करें - ORMLite, Gson और Android

मैं एक एंड्रॉइड ऐप विकसित कर रहा हूं जो बाहरी एपीआई के माध्यम से डेटा प्राप्त करता है और ORMLite का उपयोग करके स्थानीय रूप से डेटा स्टोर करता है। स्थानीय स्तर पर डेटा भंडारण और ORMLite के प्रयोग से पूर्व मैं मॉडल जो सर्वर से JSON लिया गया था और के माध्यम से इसे पार्स:

public class Image { 
    int id; 
    int creator_id; 
    String url; 
} 
:

Gson gson = new Gson(); 

String result = ApiClient.httpPost("/user_route"); 

User user = gson.fromJson(result, User.class); 

उपयोगकर्ता वर्ग

public class User { 
    int id; 
    String name; 
    ArrayList<Image> media; 
} 

और छवि वर्ग परिभाषित किया गया था

यह मॉडल और विधियों का सरलीकृत प्रतिनिधित्व है लेकिन मेरा मानना ​​है कि मैंने सभी प्रासंगिक जानकारी रखी हैं। बीटीडब्ल्यू, media एक JSON ऑब्जेक्ट है जिसमें Images है।

अब मैं स्थानीय रूप से डेटा स्टोर करने की कोशिश कर रहा हूं। ORMLite का उपयोग कर उपयोगकर्ताओं और छवियों के बीच संबंध बनाने के लिए ऐसा लगता है कि आपको विदेशी कोलेक्शन क्लास और @ForeignCollectionField एनोटेशन को नियोजित करना होगा। मुझे विश्वास नहीं है कि जीसन सीधे उपयोगकर्ता वर्ग में media फ़ील्ड के लिए जेसन को विदेशी वर्गीकरण ऑब्जेक्ट के रूप में पार्स कर सकता है, इसलिए मैंने सोचा कि मुझे दो फ़ील्ड mediaCollection और media बनाने की आवश्यकता है।

अब उपयोगकर्ता वर्ग ORMLite का उपयोग करते हुए इस तरह दिखता है:

@DatabaseTable(tableName = "Images") 
public class Image { 

    @DatabaseField(generatedId = true) 
    int id; 

    @DatabaseField(foreign=true, foreignAutoCreate=true, foreignAutoRefresh=true) 
    private User user; 

    @DatabaseField 
    int creator_id; 

    @DatabaseField 
    String url; 

} 

कैसे एप्लिकेशन के प्रवाह से काम करता है पहले मैं स्थानीय मारा है:

@DatabaseTable(tableName = "Users") 
public class User { 
    @DatabaseField(generatedId = true) 
    int id; 

    @DatabaseField 
    String name; 

    @ForeignCollectionField 
    ForeignCollection<Image> mediaCollection; 

    ArrayList<Image> media; 
} 

ORMLite साथ छवि वर्ग इस तरह दिखता है उपयोगकर्ता के लिए डेटाबेस। मैं कुछ तर्क करता हूं जो तब निर्धारित करता है कि मुझे वास्तव में सर्वर को 'अपडेट' या 'रीफ्रेश' करने के लिए सर्वर को हिट करने की आवश्यकता है या नहीं।

चाहे डेटा स्थानीय रूप से या दूरस्थ सर्वर से आता है, मुझे उसी दृश्य में Image प्रदर्शित करने की आवश्यकता है। जैसा कि यह अभी खड़ा है, Image के लिए यूआरएल विभिन्न प्रकार की वस्तुओं में संग्रहीत है, इस पर निर्भर करता है कि डेटा स्थानीय या दूरस्थ है या नहीं। मैं क्या करना चाहता हूं कि ImageForeginCollection ऑब्जेक्ट में संग्रहीत है, उस ऑब्जेक्ट को ArrayList में परिवर्तित करें और फिर मेरे शेष कोड के साथ आगे बढ़ें जो Image यूआरएल निकालता है और इसे प्रदर्शित करता है।

मुझे लगता है कि दो प्रश्न हैं।

  1. यह एक अच्छी योजना है या मैं डेटा से Image यूआरएल निकालने, ArrayList करने के लिए ForeignCollection से वस्तु परिवर्तित नहीं की दो पूरी तरह से अलग हो लिखना चाहिए?

  2. यदि यह एक अच्छी योजना है, मैं कैसे एक ForeginCollection एक ArrayList को परिवर्तित?

+0

किसी अन्य संबंधित थ्रेड में उत्तर देखें: http://stackoverflow.com/a/31598771/3495371 –

उत्तर

20

क्या यह एक अच्छी योजना है या क्या मुझे डेटा से छवि यूआरएल निकालने के दो पूरी तरह से अलग तरीके लिखना चाहिए, ऑब्जेक्ट को विदेशी चयन से ArrayList में परिवर्तित नहीं करना चाहिए?

यह काम करना चाहिए। मुझे अन्यथा ऐसा करने का एक आसान तरीका नहीं दिख रहा है।

कुछ अंक:

  • वहाँ कोई रास्ता तो यह जब JSON स्थानांतरित नजरअंदाज कर दिया है क्षणिक रूप ForeignCollection चिह्नित करने के लिए है? फिर आप JSON और ORMLite दोनों के लिए उसी User ऑब्जेक्ट का उपयोग कर सकते हैं।
  • कुछ प्रकार की hydrate() विधि अच्छी होगी, इसलिए यह media ->mediaCollection और इसके विपरीत रूपांतरित हो जाएगी।
  • यदि आपको जेएसओएन स्थानांतरित छवियों को विदेशी संग्रह में लोड करने की आवश्यकता है तो आपको Dao.getEmptyForeignCollect(...) विधि का उपयोग करना चाहिए। एक बार आपके पास संग्रह हो जाने के बाद, आप इसमें छवियां जोड़ सकते हैं और उन्हें टेबल में जोड़ा जाएगा।

यदि यह एक अच्छी योजना है, मैं कैसे एक ArrayList करने के लिए एक ForeignCollection परिवर्तित?

यह आसान है। एक ForeignCollection एक Collection है। तुम सिर्फ एक कर सकते हैं:

media = new ArrayList<Image>(mediaCollection); 

तो अपने User.getMedia() विधि null लिए जाँच करनी चाहिए और यदि हां, तो mediaCollection क्षेत्र से परिवर्तित करते हैं।

+0

क्या आप 'विदेशी चयन' से रूपांतरण पर विस्तार कर सकते हैं ? मैं 'छवि [] मीडिया = मीडियाकोलेक्शन.टोअरे (नई छवि [0]) का उपयोग करके एक सरणी प्राप्त करने की कोशिश कर रहा हूं, लेकिन यह' java.lang.IllegalStateException फेंकता है: पहले से बंद ऑब्जेक्ट को फिर से खोलने का प्रयास: SQLiteDatabase [ ...] 'LazyForeignCollection से stemming: 232'। –

0

आप पहले डेटाबेस में वस्तुओं के भंडारण के अलावा किसी अन्य ForeignCollection नहीं बना सकते, तो ormlite उन्हें ForeignCollection में पुनः प्राप्त किया है। आप विदेशी चयन के बजाय संग्रह का उपयोग कर सकते हैं, लेकिन यह वैसे ही काम करता है।मैं जो करता हूं वह निम्नलिखित है: मेरे पास मूल वर्ग में दो संग्रह हैं। एक ArrayList है कि जेसन या एक्सएमएल deserialized है। जब मूल वस्तु संग्रहित हो जाती है, तो दाओ ऑब्जेक्ट में डेटाबेस को संग्रहित करता है, तालिका में जो अन्य संग्रह, एक विदेशी चयन से जुड़ा हुआ है। जब मूल ऑब्जेक्ट पुनर्प्राप्त किया जाता है, तो यह स्वचालित रूप से विदेशी चयन में ऑब्जेक्ट्स को शामिल करता है। यह सही नहीं है, लेकिन यह काम करता है।

+2

यह कुछ हद तक गलत है। आप 'Dao.getEmptyForeignCollection (...) 'विधि का उपयोग करके एक नया' विदेशी चयन 'प्राप्त कर सकते हैं। यहां देखें: http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/Dao.html#getEmptyForeignCollection(java.lang.String%29 – Gray

2

बस @ForeignCollectionFieldArrayList<Object> को से कन्वर्ट करने के लिए आप ऐसा कर सकते हैं:

ArrayList<Object> taskFieldsList = new ArrayList<Object>(your collection); 

आशा है कि यह आपकी मदद कर रहा है।