सर्वश्रेष्ठ प्रणालियां? - कोर डेटा एंटिटी अट्रैक्शन के रूप में एरे / डिक्शनरी [बंद]


176

मैं Core Data में नया हूँ। मैंने देखा है कि संग्रह प्रकार विशेषता प्रकारों के रूप में उपलब्ध नहीं हैं और यह जानना चाहते हैं कि एक विशेषता के रूप में सरणी / शब्दकोश प्रकार के डेटा को संग्रहीत करने का सबसे कुशल तरीका क्या है (उदाहरण के लिए, जो सड़क, शहर, आदि जैसे पते बनाते हैं) एक अलग इकाई की आवश्यकता नहीं है और इसे अलग-अलग विशेषताओं / क्षेत्रों की तुलना में शब्दकोश / सरणी के रूप में अधिक आसानी से संग्रहीत किया जाता है। धन्यवाद।


6
पते के लिए स्ट्रिंग फ़ील्ड्स के साथ एक इकाई बनाना संभवतः एक शब्दकोश की तुलना में उपयोग करना आसान है, जहां आपको अपनी कुंजियों को याद रखना होगा ...
डैनियल

जवाबों:


247

कोर डेटा में कोई "मूल" सरणी या शब्दकोश प्रकार नहीं है। आप एक NSArrayया NSDictionaryएक परिवर्तनीय विशेषता के रूप में संग्रहीत कर सकते हैं । यह NSCodingसरणी या डिक्शनरी को NSDataविशेषता के लिए अनुक्रमित करने के लिए उपयोग करेगा (और इसे एक्सेस करने पर उचित रूप से डिसेरिएलाइज़ करता है)। इस दृष्टिकोण का लाभ यह है कि यह आसान है। नकारात्मक पक्ष यह है कि आप सरणी या शब्दकोश में क्वेरी नहीं कर सकते (यह डेटा स्टोर में BLOB के रूप में संग्रहीत है) और यदि संग्रह बड़े हैं, तो आपको डेटा स्टोर से बहुत डेटा स्थानांतरित करना होगा (यदि यह है) SQLite डेटा स्टोर) केवल संग्रह के एक छोटे हिस्से को पढ़ने या संशोधित करने के लिए।

विकल्प सरणी या शब्दकोश संग्रह के शब्दार्थ को मॉडल करने के लिए कोर डेटा टू-कई रिश्तों का उपयोग करना है। Arrays आसान होती है, इसलिए इससे शुरुआत करें। कोर डेटा-कई रिश्ते वास्तव में एक सेट को मॉडलिंग कर रहे हैं, इसलिए यदि आपको सरणी जैसी कार्यक्षमता की आवश्यकता है, तो आपको या तो सेट को सॉर्ट करना होगा (भ्रूण की संपत्ति का उपयोग करना ऐसा करने का एक सुविधाजनक तरीका है) या इकाई में एक अतिरिक्त सूचकांक विशेषता जोड़ें सरणी आइटम संग्रहीत करता है और अनुक्रमणिका को स्वयं प्रबंधित करता है। यदि आप एक सजातीय सरणी का संग्रह कर रहे हैं (सभी प्रविष्टियाँ समान हैं), तो सरणी संस्थाओं के लिए इकाई विवरण को मॉडल करना आसान है। यदि नहीं, तो आपको यह तय करना होगा कि आइटम डेटा को संग्रहीत करने या आइटम संस्थाओं का एक परिवार बनाने के लिए एक परिवर्तनीय विशेषता का उपयोग करना है या नहीं।

एक शब्दकोश की मॉडलिंग के लिए एक कुंजी और एक मूल्य को संग्रहीत करने वाली संस्थाओं के एक सेट के लिए कई-कई संबंधों की आवश्यकता होगी। कुंजी और मूल्य दोनों सरणी के लिए आइटम इकाई के अनुरूप हैं, ऊपर वर्णित है। इसलिए वे या तो देशी प्रकार के हो सकते हैं (यदि आप उन्हें समय से पहले जानते हैं), एक परिवर्तनशील विशेषता या एक प्रकार के विशिष्ट संस्थानों के परिवार से उदाहरण के लिए संबंध।

यदि यह सब थोड़ा कठिन लगता है, तो यह है। कोर डेटा की तरह स्कीमा-डिपेंडेंट फ्रेमवर्क में शूकरिंग मनमाना डेटा कठिन है।

पतों की तरह संरचित डेटा के लिए, संस्थाओं को स्पष्ट रूप से मॉडलिंग करते समय व्यतीत करना आसान होता है (उदाहरण के प्रत्येक भाग के लिए एक विशेषता)। शब्दकोश को मॉडल करने के लिए सभी अतिरिक्त कोड से बचने के अलावा, यह आपके UI को आसान बनाता है (बाइंडिंग "बस काम करेगा") और आपका सत्यापन तर्क आदि बहुत स्पष्ट है क्योंकि इसे कोर डेटा द्वारा संभाला जा सकता है।

अपडेट करें

OS X 10.7 के रूप में, कोर डेटा में एक ऑर्डर किया गया सेट प्रकार शामिल होता है जिसका उपयोग किसी सरणी के स्थान पर किया जा सकता है। यदि आप 10.7 या उसके बाद का लक्ष्य बना सकते हैं, तो ऑर्डर किए गए (सरणी-जैसे) संग्रह के लिए यह सबसे अच्छा समाधान है।


दूसरा - पुष्टि की जो मैंने पहले ही सोचा था, लेकिन मुझे परिवर्तनीय विशेषताओं के बारे में नहीं पता था।
jkp

3
@pixelfreak परिवर्तनीय का उपयोग इस बात पर निर्भर करता है कि आपको संग्रह में वस्तुओं का उपयोग करने की आवश्यकता है। यदि आपको उनके खिलाफ क्वेरी करने की आवश्यकता है, या आप कुछ या सभी को आलसी लोड करने में सक्षम होना चाहते हैं, तो एक परिवर्तनीय विशेषता काम नहीं करेगी। यदि आपको आलसी लोड की आवश्यकता नहीं है, तो क्वेरी करने की आवश्यकता नहीं है और हमेशा सभी वस्तुओं की आवश्यकता है या कोई भी नहीं, एक परिवर्तनीय विशेषता आपके लिए काम कर सकती है (और निश्चित रूप से इसे लागू करना आसान है)।
बैरी वार्क

3
बैरी कहते हैं कि कोर डेटा प्रोग्रामिंग गाइड, अध्याय गैर-मानक स्थायी विशेषताओं में अधिक विस्तार से वर्णित है ।
पालिमोंडो

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

2
मुझे "नए ऑर्डर किए गए सेट" के बारे में समझ नहीं है। क्या यह एक विशेषता है? क्योंकि मैं इसे विशेषता प्रकार मेनू में नहीं देख सकता।
प्लॉट

11

मेरा मुद्दा भी ऐसा ही था। मेरे मामले में, मैं तार की एक सरणी को मैप करना चाहता था। मैंने बैरी की सलाह का पालन किया और आखिरकार यह काम कर गया। यहाँ कुछ कोड की तरह दिखता है (जो किसी और के लिए चीजों को स्पष्ट रूप से स्पष्ट करेगा जो इसमें चलता है) ...

मेरी एंटिटी कुछ इस तरह दिखती है:

@interface AppointmentSearchResponse : NSManagedObject
@property (nonatomic, retain) NSSet *messages;
@end

मेरा प्रबंधन ऑब्जेक्ट मॉडल कोड (कोर डेटा) कोड कुछ इस तरह दिखता है:

NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init];
[entityDescription setName:@"AppointmentSearchResponse"];
[entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"];

NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array];
NSAttributeDescription *messageType = [[NSAttributeDescription alloc] init];    
[messageType setName:@"messages"];
[messageType setAttributeType:NSTransformableAttributeType];
[appointmentSearchResponseProperties addObject:messageType];

[entityDescription setProperties:appointmentSearchResponseProperties];

तो यहाँ मुख्य आइटम हैं:

  • मैं संपत्ति प्रकार के लिए एक NSSet का उपयोग कर रहा हूं
  • मैं कोर डेटा प्रबंधित ऑब्जेक्ट मॉडल में विशेषता प्रकार के रूप में NSTransformableAttributeType का उपयोग कर रहा हूं।

तो क्या आपने इस कोड को AppointmentSearchResponse.m के अंदर एक init मेथड के अंदर रखा होगा?
चिकोविट्ज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.