विशिष्ट ऑब्जेक्ट आईडी से कोर डेटा ऑब्जेक्ट कैसे प्राप्त करें?


120

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

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];

हालाँकि, मैं इसे इस तरह से करना चाहूंगा कि यह अपना स्वयं का अनुरोध न करे। कोई विचार?


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

जवाबों:


208

तुम्हें चाहिए:

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

उस ID से उस ऑब्जेक्ट को प्राप्त करता है, जिसमें वह ID या nil है, यदि वह मौजूद नहीं है।

(अवगत रहें: NSManagedObjectContext पर ऐसे ही-प्रचलित नामों के साथ दो विधियाँ हैं जिन्होंने मुझे उलझा दिया है। उन्हें सीधे रखने में मदद करने के लिए, यहाँ अन्य दो क्या हैं:

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

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

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

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

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


11
-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectIDसंभवतया तब उपयोगी होता है जब आप यह देखना चाहते हैं कि कोई वस्तु पहले से ही मौजूद है या नहीं और उसे लाना नहीं चाहती।
टोनी

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

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

महान जवाब, के बारे में स्पष्टीकरण के लिए धन्यवाद objectWithId:- insertObjectगलती को आग लगाने के प्रयास पर अपवाद को रोकने के लिए पहले कॉल करने की आवश्यकता वास्तव में मेरे लिए अवज्ञाकारी थी।
स्टैनिस्लाव पानकेविच

3
objectRegisteredForID:तब उपयोगी होता है जब आपके पास किसी अन्य संदर्भ में किसी ऑपरेशन से ऑब्जेक्ट की सूची होती है, और आप केवल उन लोगों को अपडेट करना चाहते हैं जिनके पास स्थानीय संदर्भ में बासी डेटा हो सकता है। यह आपके ऑब्जेक्ट ग्राफ (और इसलिए मेमोरी उपयोग) को चेक में रखता है, और -registeredObjectsऑब्जेक्ट को आपके संदर्भ के लिए दोषपूर्ण है या नहीं, यह देखने के लिए ऑब्जेक्ट को चेक करना और जांचना बेहतर है ।
स्टर्लिंग आर्चर

4

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

यह WWDC 2012 के सत्र "कोर डेटा बेस्ट प्रैक्टिसेस" में गहराई से शामिल है ।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.