2009-08-12 12 views
6

मैं कोको में एक आवेदन विकसित कर रहा हूं। मुझे एक गंभीर समस्या का सामना करना पड़ रहा है।"कोर डेटा एक गलती को पूरा नहीं कर सका .." त्रुटि

मैं निम्नलिखित कोड का उपयोग कर कोर डाटा में नाम "निर्देशिका" किसी वस्तु की प्रविष्टियों को हटाने हूँ:

NSEnumerator *tempDirectories = [[folderArrayController arrangedObjects] objectEnumerator]; 
id tempDirectory; 
while (tempDirectory = [tempDirectories nextObject]){ 
    [managedObjectContext deleteObject:tempDirectory]; 
} 

लेकिन करने के दौरान कभी कभी की तरह "कोर डाटा एक गलती को पूरा नहीं कर सकता है .." एक अपवाद तब होता है हटाने के बाद बचाओ। मैं कोड [managedObjectContext save];

का उपयोग कर रहा हूं मैं कोर डेटा में नया हूं ... समाधान के लिए तत्पर हूं।

+1

यहां तीसरे पैराग्राफ को देखें: [दोष पूरा नहीं किया जा सकता है] (http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320- एसडब्ल्यू 7) –

+0

लेकिन डीबग कैसे करें और यह पता लगाएं कि सटीक मॉड्यूल कौन सा अपवाद पैदा कर रहा है? ऐप्पल डॉक्टर लिंक के लिए –

उत्तर

4

यह एक पुराना सवाल है, मैंने कुछ समय से इसे हल करने में संघर्ष किया है। तो, सोचा कि इसे दस्तावेज करना सबसे अच्छा होगा।

ऊपर उल्लिखित वीचसेल के रूप में, the Apple documentation सही रूप से इस अपवाद के कारण बताता है। लेकिन यह मॉड्यूल की पहचान करने के लिए एक व्यस्त काम है जिसके कारण एनएसएमएनेज्ड ऑब्जेक्ट सबक्लास 'ऑब्जेक्ट को बनाए रखा जा रहा है (यदि दस्तावेज़ में पहला उद्धृत कारण समस्या का मूल कारण है)।

तो, मैंने अपने कोड के उन हिस्सों की पहचान करके शुरुआत की जो एनएसएमएनेज्ड ऑब्जेक्ट को बनाए रखते थे, इसके बजाय मैंने एनएसएमएनेज्ड ऑब्जेक्टिड को बनाए रखा और जब भी आवश्यक हो, प्रबंधित ऑब्जेक्ट को बना दिया। इसी तरह की लाइनों में चर्चा Restkit प्रलेखन में पाया जा सकता है:

  1. https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39
  2. https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605

मेरी सेटर अपडेट किया गया और मनुष्य इतना है कि मॉड्यूल के बाकी के साथ इंटरफेस ही रहते हैं, जबकि आंतरिक रूप से अब हम निर्भर NSManagedObjectID पर और NSManageObject के बनाए रखने से बचने:

-(CSTaskAbstract*)task 
{ 
    CSTaskAbstract *theTask = nil; 
    if (self.taskObjectID) 
    { 
     NSManagedObjectContext *moc = [(CSAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
     // https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39 & 
     // https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605 
     NSError *theError = nil; 
     NSManagedObject *theObject = [moc existingObjectWithID:self.taskObjectID 
                 error:&theError]; 
     if ([theObject isKindOfClass:[CSTaskAbstract class]]) 
     { 
      theTask = (CSTaskAbstract*)theObject; 
     } 
    } 
    return theTask; 
} 
-(void)setTask:(CSTaskAbstract *)inTask 
{ 
    if (inTask!=self.task) 
    { 
     // Consequences of retaining a MO when it is detached from its MOC 
     [self setTaskObjectID:[inTask objectID]]; 
    } 
} 

ऊपर पहले hal है समस्या का एफ हल हो गया। हमें अपने ऐप के संदिग्ध हिस्सों में निर्भरता को खोजने और खत्म करने की आवश्यकता है।

कुछ अन्य समस्या भी थी, यंत्र -> आवंटन यह पता लगाने के लिए एक अच्छा स्रोत है कि कौन से मॉड्यूल वास्तव में प्रबंधित वस्तुओं को बनाए रखते हैं, अपवाद ऑब्जेक्ट में विवरण होगा कि किस प्रबंधित ऑब्जेक्ट समस्या पैदा कर रहा है, उसके लिए फ़िल्टर परिणाम जैसा कि नीचे दिखाया वस्तु:

Instruments - Allocations

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

+0

+1 – Martin

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