2011-02-17 25 views
111

मैं आसानी से निम्नलिखित कोड का उपयोग कर कोर डाटा में एक वस्तु की आईडी प्राप्त कर सकते हैं:विशिष्ट ऑब्जेक्ट आईडी से कोर डेटा ऑब्जेक्ट कैसे प्राप्त करें?

NSManagedObjectID *moID = [managedObject objectID]; 

हालांकि, वहाँ एक तरह से यह एक विशिष्ट वस्तु आईडी देकर कोर डेटा संग्रह से बाहर एक वस्तु प्राप्त करने के लिए है? मुझे पता है कि मैं एक NSFetchRequest उपयोग करते हुए, इस तरह से कर सकते हैं:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID]; 
[fetchRequest setPredicate:predicate]; 

हालांकि, मैं एक तरीका है कि अपने स्वयं के लाने का अनुरोध आरंभ नहीं करता है में ऐसा करना चाहते हैं। कोई विचार?

+0

लेकिन अनुरोध रास्ता लाने आप सेट कर सकते हैं गुण या संबंधों पहले से प्राप्त किए जा करने के लिए के रूप में आप चीजों का उपयोग जो आप के बजाय उत्कृष्ट क्षमता कई और अधिक प्रश्नों दे देंगे साथ। – malhal

उत्तर

197

आप चाहते हैं:

-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID 
            error:(NSError **)error 

दुकान है कि आईडी, या नहीं के बराबर है, तो यह मौजूद नहीं है है कि से वस्तु को हासिल करेगा।

(प्रति सचेत रहें:।

-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID 

... एक पैदा करेगा: वहाँ इसी तरह-प्रतीयमान ऐसे नाम हैं जो मुझे फिसल के साथ NSManagedObjectContext पर दो तरीके हैं मदद करने के लिए उन्हें सीधे रखने के लिए, यहाँ क्या अन्य दो करते हैं प्रदान की objectId, के साथ वस्तु जब तक आप NSManagedObjectContext के insertObject: के साथ पहली ऑब्जेक्ट सम्मिलित किया जाए या नहीं इस तरह के एक वस्तु वास्तव में दुकान में मौजूद है। यदि यह मौजूद नहीं है, कुछ भी है कि गलती आग असफल हो जायेगी गलती। केवल उपयोग मैं ऑब्जेक्ट आईडी को संरक्षित करते समय स्टोर से स्टोर में वस्तुओं की प्रतिलिपि बना रही है।

-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID 

... उस आईडी को वापस कर देगा जिसमें आईडी, है यदि इसे इस प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट द्वारा स्टोर से लाया गया है। यदि कोई जानता है कि यह विधि किस लिए उपयोगी है, तो कृपया टिप्पणी करें।)

[eta .: पहली विधि और दूसरे दो के बीच एक और महत्वपूर्ण अंतर यह है कि existingObjectWithID:error: कभी गलती नहीं करता है; यह हमेशा आपके लिए पूरी वस्तु लाता है। यदि आप इससे बचने की कोशिश कर रहे हैं (उदाहरण के लिए एक बड़ी ब्लॉब प्रॉपर्टी के साथ महंगी-टू-फ़ेच ऑब्जेक्ट के साथ काम करना), तो आपको objectWithID: या objectRegisteredForID: के साथ चालाक होना चाहिए, जो दोषों को नहीं चलाता है; या एक ठीक से लाने के लिए कॉन्फ़िगर अनुरोध का उपयोग करें।]

+11

'- (NSManagedObject *) objectRegisteredForID: (NSManagedObjectID *) objectID' जब तुम सिर्फ अगर एक वस्तु पहले से ही संदर्भ में मौजूद है और यह लाने के लिए नहीं करना चाहते हैं देखना चाहते हैं शायद उपयोगी है। – Tony

+0

मेरा अभिवादन। '-tableView पर: didSelectRowAtIndexPath:' UIAlertView हां/नहीं प्रदर्शित होता है। "हां" पर - वस्तु के साथ कुछ काम है। मैं रिमोट से 'NSFetchedResultsController' + पृष्ठभूमि CoreData अपडेट का उपयोग करता हूं। इसलिए मैं ऑब्जेक्ट स्टोर नहीं कर सकता: जबकि स्क्रीन पर अलर्ट है, स्टोरेज को अपडेट किया जा सकता है और ऑब्जेक्ट हटा दिया जा सकता है। मैं ऑब्जेक्ट स्टोर करता हूं, फिर इसे अलर्ट प्रतिनिधि में एक बार फिर से प्राप्त करें। क्योंकि मैं 'NSFetchedResultsController' का उपयोग करता हूं - सभी आवश्यक ऑब्जेक्ट्स पहले से ही इस पल में संदर्भ में हैं। इसके अलावा, जब संदर्भ में कोई वस्तु नहीं है, कोरडाटा को बेकार लाने का प्रयास नहीं करना चाहिए। – kpower

+0

अच्छा जवाब, धन्यवाद! इन विधि नाम वास्तव में मुश्किल हैं। गलत सब कुछ – jackal

2

objectWithID: विधि आप देख रहे हैं, और यह यह करने के लिए सिफारिश की तरीका है। objectWithID: ऑब्जेक्ट को केवल उतने स्तरों को खींचने के लिए NSManagedObjectContext का कुशलतापूर्वक उपयोग करेगा - ऐसा करने के अन्य तरीकों के विपरीत। objectWithID: बैकिंग स्टोरेज पर जाने से पहले माता-पिता संदर्भों, लगातार स्टोर समन्वयक, और लगातार स्टोर में मेमोरी जानकारी का सही ढंग से उपयोग करेगा।

यह WWDC 2012 सत्र "कोर डेटा सर्वोत्तम व्यवहार" में गहराई से ढका हुआ है।

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