2009-08-12 52 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