2012-04-26 20 views
15

के रूप में NSManagedObject के गुण प्राप्त करें यदि मेरे पास एक संदर्भ से प्राप्त एनएसएमएनेज ऑब्जेक्ट है, तो मैं प्रत्येक गति को स्पष्ट रूप से शब्दकोश में कॉपी किए बिना अपने गतिशील गुणों से एनएस डिक्शन कैसे बना सकता हूं?NSDictionary

अपने प्रबंधित वस्तु लग रहा है इस तरह, उदाहरण के लिए:

@implementation Track 

@dynamic artist; 
@dynamic group; 
@dynamic purchase_url; 
@dynamic title; 
@dynamic file_name; 
@dynamic year; 

@end 

डेटाबेस से प्राप्त करने में कठिनाई के बाद, इस मामले में, मैं एक NSDictionary एक ही गुण उन @dynamic संपत्तियों में से प्रत्येक के लिए सेट के साथ की जरूरत है।

+1

आप के बारे में तुम क्यों ऐसा करना चाहते हैं और अधिक विस्तार दे सकते हैं, वहाँ के लिए एक बेहतर तरीका हो सकता है आप जो चाहते हैं उसे प्राप्त करें। इस बीच, एनएसईएनटीटी डिस्क्रिप्शन और फीचर्सबिननाम देखें। – jrturton

+1

[इस आलेख] पर एक नज़र डालें (http://vladimir.zardina.org/2010/03/serializing-archivingunarchiving-an-nsmanagedobject-graph/)। यह आपको किसी भी रिश्ते के लिए भी शामिल करता है। – Alladinian

उत्तर

46

एक तेज़ तरीका (https://stackoverflow.com/a/5664745/2294824 पर Matthias Bauch प्रतिक्रिया से) एक NSDictionary के लिए एक NSManagedObject कन्वर्ट करने के लिए नहीं है:

NSArray *keys = [[[myObject entity] attributesByName] allKeys]; 
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys]; 
+0

इस उत्तर के लिए धन्यवाद, यह मुझे एक लंबे समय तक समस्या को लपेटने में मदद करता है। –

+0

इसके लिए कोई रिवर्स है? Coredata के लिए NSdictionary? – Nil

+1

रिवर्स को उत्तर से लिंक में वर्णित किया गया है: [myObject setValuesForKeysWithDictionary: dict] – Werewolf

10

आप निम्न विधि द्वारा अपने दृष्टिकोण को प्राप्त कर सकते हैं:

unsigned int count; 
objc_property_t *properties = class_copyPropertyList([CoreDataObject class], &count); 
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:16]; 

for(int i = 0; i < count; i++) { 
    objc_property_t property = properties[i]; 
    NSString *name = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; 
    id obj = [coreDataObjectInstance valueForKey:name]; 
    if (obj) { 
     // Skip properties with nil values (optionally you can use: [dictionary setObject:((obj == nil) ? [NSNull null] : obj) forKey:name]; without any if-statement) 
     [dictionary setObject:obj forKey:name]; 
    } 
} 

free(properties); 

"CoreDataObject" कोर डेटा आपत्ति आप एक NSDictionary में परिवर्तित करने, जबकि "coreDataObjectInstance" इस कोर डेटा वस्तु का एक उदाहरण है चाहेंगे। ध्यान रखें कि आप के लिए है:

#include <objc/runtime.h> 

इसके अलावा, अगर आप हमें कुछ और अंतर्दृष्टि आप इस विचार के साथ प्राप्त करने के लिए चाहते हैं क्या दे सकते हैं बहुत अच्छा होगा, शायद वहाँ एक अलग/बेहतर समाधान है।

आशा है कि इससे मदद मिलती है!

+0

मैं इस बारे में विवरण आपके साथ साझा करना चाहता हूं कि मैं इसका उपयोग कैसे कर सकता हूं, मैं इंस्पेक्टर विंडो बनाना चाहता हूं, इसलिए यदि आपने nsmanagedobject subclass के साथ आबादी वाली तालिका में एक पंक्ति का चयन किया है, तो इंस्पेक्टर विंडो इस प्रबंधित ऑब्जेक्ट के गुण दिखाएगी तीन कॉलम कथा: संपत्ति का नाम, संपत्ति का प्रकार "स्ट्रिंग, int ..." और प्रोप मान आपको इस परिदृश्य को प्राप्त करने का सबसे अच्छा तरीका क्या लगता है ?? – AMTourky

6

मुझे लगता है कि यह है कि क्या आप वास्तव में के लिए देख रहे है:

[trackEntity propertiesByName]; 
[trackEntity relationshipsByName]; 
[trackEntity attributesByName]; 

इन शब्दकोशों में से प्रत्येक कुंजी संपत्ति के लिए इसी होगा:

NSEntityDescription *trackEntity = [NSEntityDescription entityForName:[Track entityName] inManagedObjectContext:yourMOC]; 

तो आप इन शब्दकोशों की पहुंच है और मूल्य एक एनएसपीप्रर्टी डिस्क्रिप्शन होगा।

+0

रिश्तों ByName मूल्यों का एक शब्दकोश देता है जो NSRelationshipDescription ऑब्जेक्ट्स हैं .... –