2011-12-26 15 views
38

मेरा ऐप कोर डेटा (जादुई रिकॉर्ड की कुछ मदद के साथ) का उपयोग करता है और NSOperation का उपयोग करके बहुत अधिक multithreaded है।कोर डेटा -existingObjectWithID: त्रुटि: त्रुटि 133000

बेशक मैं धागे/संचालन के बीच केवल NSManagedObjectID पास करने के लिए बहुत सावधान हूं।

अब, वापस एक ऑपरेशन में इसी प्रबंधित वस्तु को पाने के लिए, मैं -existingObjectWithID:error: इस प्रकार का उपयोग करें:

Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error]; 

लेकिन क्या मैं वापस पाने के नहीं के बराबर है और error का कहना है कि यह एक त्रुटि # 13300 है: NSManagedObjectReferentialIntegrityError

यहाँ प्रलेखन इस त्रुटि के बारे कहते हैं:

NSManagedObjectReferentialIntegrityError 
Error code to denote an attempt to fire a fault pointing to an object that does not exist. 
The store is accessible, but the object corresponding to the fault cannot be found. 

कौन सा मेरे मामले में सच नहीं है: उस वस्तु मौजूद है। दरअसल, अगर मैं Collection इकाई के सभी उदाहरणों के माध्यम से NSFetchRequest के साथ पुन: प्रयास करता हूं, तो मुझे यह पता चलता है, और इसके NSManagedObjectID बिल्कुल मैं -existingObjectWithID:error: पर गया हूं।

इसके अलावा, अगर मैं -objectWithID: का उपयोग करता हूं, तो मुझे सही वस्तु वापस ठीक मिलती है।

तो कुछ ऐसा है जो मुझे याद आ रहा है। यहां कुछ अतिरिक्त अवलोकन/प्रश्न हैं:

  • "एक वस्तु जो मौजूद नहीं है": उस वाक्य में "अस्तित्व" का क्या अर्थ है? "अस्तित्व" कहाँ है? यह उस बिंदु पर मेरे कोर डेटा स्टोर में निश्चित रूप से "मौजूद" है।
  • "गलती से संबंधित वस्तु नहीं मिल सकती है": उस वाक्य में "पाया" का क्या अर्थ है? "पाया" कहाँ? यह निश्चित रूप से उस बिंदु पर मेरे कोर डेटा स्टोर में "पाया"।

तो शायद मुझे existingObjectWithID:error: के बारे में कुछ याद आ रहा है? दस्तावेज़ीकरण कहता है:

If there is a managed object with the given ID already registered in the context, that object is returned directly; otherwise the corresponding object is faulted into the context. 
[...] 
Unlike objectWithID:, this method never returns a fault. 

यह मेरी समस्या में मदद नहीं करता है। मुझे लगता है कि मेरी वस्तु पूरी तरह से दोषपूर्ण नहीं है, और कोई गलती नहीं है। वास्तव में, जब मैं ऑब्जेक्ट गुणों तक पहुंचता हूं तो इसके भीतर कोई भी गलती अगली कोड लाइन पर आग लग जाएगी।

  • एक यथार्थवादी परिदृश्य क्या होगा NSManagedObjectReferentialIntegrityError?

किसी भी ज्ञान के लिए धन्यवाद।

+2

क्या आपने कभी यह पता लगाया है? मुझे एक ही समस्या मिल रही है और मेरी वस्तु निश्चित रूप से वहां है और बचत अभियान चल रहा है, लेकिन यह केवल sporadically होता है। – Adam

उत्तर

36

समस्या यह है कि NSManagedObjectID आप पास अस्थायी हैं। आप इसे NSManagedObjectID की isTemporaryID विधि पर कॉल करके देख सकते हैं। डॉक्स से:

Returns a Boolean value that indicates whether the receiver is temporary.

Most object IDs return NO. New objects inserted into a managed object context are assigned a temporary ID which is replaced with a permanent one once the object gets saved to a persistent store.

आप पहली बार, लगातार दुकान को अपने परिवर्तनों को सहेजने चाहिए तो केवल एक स्थायी आईडी प्राप्त अन्य संदर्भ के लिए पारित करने के लिए।

8

जब आप एकाधिक संदर्भों का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि आप संदर्भ ए से किसी अन्य संदर्भ बी से प्रबंधित ऑब्जेक्ट आईडी पास करने से पहले संदर्भ ए को सहेज लें। केवल सहेजने के बाद यह ऑब्जेक्ट संदर्भ बी से उपलब्ध होगा।

-objectWithID: हमेशा एक गैर-शून्य ऑब्जेक्ट लौटाएगा, लेकिन स्टोर में कोई बैकिंग ऑब्जेक्ट नहीं होने पर यह इसका उपयोग शुरू करने के बाद अपवाद फेंक देगा। -existingObjectWithID:error: वास्तव में कुछ एसक्यूएल चलाएगा और I/O करेगा यदि वह ऑब्जेक्ट उस संदर्भ के साथ पहले से पंजीकृत नहीं है जिसका उपयोग किया जाता है।

+2

यह नहीं है: जब मैं '-objectWithID का उपयोग करता हूं: ', मुझे सही वस्तु मिलती है (जैसा कि मैंने लिखा था): मैं इसका उपयोग कर सकता हूं, इसे गुणों, इसके संबंधों, सबकुछ तक पहुंच सकता हूं। और वास्तव में, जिस संदर्भ में इसे बनाया गया था, वह पहले सहेजा गया था। फिर भी, '-existingObjectWithID: त्रुटि:' अभी भी त्रुटि 133000 के साथ विफल रहता है। –

+0

वास्तव में अजीब लगता है। क्या दोनों संदर्भ समान NSPersistentStoreCoordinator साझा करते हैं? –

+1

मैंने प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट पर रीसेट करके इसे हल किया "। निश्चित रूप से आदर्श नहीं है, इसलिए मैं अन्य समाधान सुनने की आशा करता हूं :-) – niklassaers

2

NSManagedObjectReferentialIntegrityError = 133000

NSManagedObjectReferentialIntegrityError Error code to denote an attempt to fire a fault pointing to an object that does not exist. The store is accessible, but the object corresponding to the fault cannot be found. Available in Mac OS X v10.4 and later. Declared in CoreDataErrors.h.

इस documentation देखें।

This tutorial आपके लिए सहायक हो सकता है।

तो संभावित कारण यह है कि आप उस वस्तु को लाने की कोशिश कर रहे हैं जो मौजूद नहीं है। यह तब होता है जब आप किसी मौजूदा वस्तु के लिए ऑब्जेक्टिड बनाने का प्रयास करते हैं। ऑब्जेक्ट आपको वापस कर दिया जाएगा और जब इस ऑब्जेक्ट के साथ ऑब्जेक्ट प्राप्त करने का प्रयास किया गया है तो आपको यह अपवाद फेंक दिया जाएगा।

0

मैंने उन्हें NSManagedObjectContextDidSave अधिसूचना से निपटने के दौरान पाया है। कई अन्य वस्तुओं को हटा दिया गया था जिन्हें हटाया नहीं जा सका क्योंकि (डुह!) उन्हें हटा दिया गया था! हालांकि कुछ हटाए गए ऑब्जेक्ट्स ठीक दिखते हैं, जैसे कि मैंने वर्तमान संदर्भ में पहले ही गलती की थी।

आप ने वही समस्या हो सकता था - वस्तुओं आप पा सकते हैं जब आप पुनरावृति दुकान इस संदर्भ में गलती गया हो सकता है इससे पहले कि वे नष्ट कर दिया गया और आप या तो इस संदर्भ में परिवर्तन विलय वापस नहीं कर रहे हैं, या बस नहीं है काफी अभी तक विलय

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