2009-08-12 36 views
6

我正在開發一個應用程序在可可。我正面臨嚴重的問題。「核心數據無法履行錯誤..」錯誤

我使用下面的代碼刪除在覈心數據名爲「目錄」的對象的條目:

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

但有時像「核心數據無法滿足故障。」一個例外,而試圖發生刪除後保存。我正在使用代碼[managedObjectContext save];

我是核心數據中的新成員...期待解決方案。

+1

看看這裏的第三段:[Fault can not be fulfilled](http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320- SW7) – 2009-08-12 09:22:35

+0

但是如何調試並找出哪個是導致此異常的確切模塊? – 2013-10-29 07:17:05

回答

4

這是一個老問題,我一直在努力解決這個問題。所以,認爲最好記錄它。

由於上面提到的Weichsel,the Apple documentation正確地指出了這個例外的原因。但是識別模塊是一件繁忙的工作,因爲NSManagedObject子類的對象被保留(如果第一個引用的原因是文檔中的原因是問題的根源)。

因此,我首先確定了保留NSManagedObject的代碼部分,而不是保留NSManagedObjectID,並在需要時創建它。在類似的路線的討論可以Restkit文檔中找到:

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

更新我的setter和getter,使與模塊的其餘部分的接口保持不變,而在內部,我們現在依賴在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。 KVO保留觀察到的管理對象,因此拋出異常,並且它的回溯不會來自我們的項目。這些都很難調試,但猜測工作和跟蹤對象的分配和保留釋放週期肯定會有所幫助。我刪除了KVO觀察部分,並開始工作。

+0

對於Apple文檔鏈接+1 – Martin 2014-10-27 17:44:50