Iphone fetchedResultsContainer的核心数据中存在严重的应用程序错误

Iphone fetchedResultsContainer的核心数据中存在严重的应用程序错误,iphone,core-data,nsfetchedresultscontroller,Iphone,Core Data,Nsfetchedresultscontroller,尝试添加记录时出现以下错误: 严重的应用程序错误。例外情况 在核心数据更改期间被捕获 处理。这通常是一个错误 在…的观察范围内 NSManagedObjectContextObjectsIDChangeNotification。 索引0对userInfo无效 (空) 就这样。我将断点放在我实现的所有fetchedResultsContainer委托方法中,但没有断点 我追踪到: NSFetchedResultsController *aFetchedResultsController = [

尝试添加记录时出现以下错误:

严重的应用程序错误。例外情况 在核心数据更改期间被捕获 处理。这通常是一个错误 在…的观察范围内 NSManagedObjectContextObjectsIDChangeNotification。 索引0对userInfo无效 (空)

就这样。我将断点放在我实现的所有fetchedResultsContainer委托方法中,但没有断点

我追踪到:

  NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleFirstLetter" cacheName:@"Root"];
“sectionNameKeyPath”就是问题所在。“titleFirstLetter”是一个临时属性,我在NSManagedObject子类中为其创建了一个getter

下面是getter:

-(NSString *)titleFirstLetter
{
  [self willAccessValueForKey:@"titleFirstLetter"];
  NSString *aString = [[self valueForKey:@"title"] uppercaseString];

  NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]];

  [self didAccessValueForKey:@"titleFirstLetter"];
  return stringToReturn;
}
当我将sectionNameKeyPath更改为nil时,它可以工作,但显然不是我想要的。当我已经为我的模型填充了一个标题时,它也可以工作,这样titleFirstLetter就不会返回nil,尽管这似乎不是什么问题。如果我将字符串设为任意值(如果为零),它仍然会崩溃

知道上面是什么吗

更新: 如果我在sectionNameKeyPath中使用标题而不是transient属性,它不会崩溃,但显然会将每个项都放在自己的节中。所以它和瞬变性质有某种联系

更新2: 一些使用持久性属性而不是暂时性属性的初步黑客攻击,并且没有其他更改,似乎工作得很好,所以这看起来是一个bug。我打开了一个bug报告:#8553064

更新3: 好吧,把它擦掉。使用持久性属性没有任何区别。我现在有点不知所措了


谢谢

获取结果控制器的默认行为是为
sectionNameKeyPath
的每个第一个字母创建一个节。除非每个项目都以不同的字母开头,否则你不应该每个项目都有一个部分


如果要自定义节名行为,请创建子类
NSFetchedResultsController
并覆盖
sectionIndexTitleForSectionName:
sectionIndexTitles
。有关详细信息,请参阅NSFetchedResultsController文档。

这可能是部分(或全部)用户错误。问题是,在添加新项的视图中,我将
[self.tableView reloadData]
放在
视图将出现的
方法中。注释out并没有更新表单元格,但阻止了崩溃

然后,我继续将
reloadRowsAtIndexPaths:withRowAnimation:
发送到表视图,手动重新加载需要它的几个单元格


我很高兴这一切终于结束了

我发现了另一种方法来实现同样的神秘异常。我的瞬态属性(与您的属性一样,用于提取第一个字母)没有受到0长度字符串(@“”)的保护。试图获取其第一个字符时引发了一个异常,并导致了此核心数据错误(而不是您希望看到的异常)。

我认为这是我的问题。我收到了同样的警告信息,但我的解决方案却大不相同

如果没有正确实现所有NSFetchedResultsController委托方法,则可能会出现此错误。对于如何实现NSFetchedResultsController,我总是从Apple复制并粘贴4种方法

不幸的是,我错过了其中一个:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}
确保你有头发,否则你会像我一样把头发拔出来。

重要吗

NSFetchedResultsController * consultMessageFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[[[WYCoreDataStorage shareStore] coreDataHelper] mainContext] sectionNameKeyPath:nil cacheName:nil];

如果使用缓存,则必须在更改任何提取请求、其谓词或其排序描述符之前调用deleteCacheWithName:。除非将cacheName设置为nil,否则不能对多个查询重复使用同一个“获取结果”控制器。

那么我在这里做错了什么?这是一个标题为sectionNameKeyPath的文件。要添加到这个文件中,文档称IndexTitle默认为大写首字母。这是真的。但我说的是章节标题,索引就是章节标题。看看联系人应用程序列表是如何命名的。它使用这种精确的内置方法。我不知道你为什么会遇到这个问题。很可能你在某个地方把这些属性弄错了。不是真的。我希望他们是一样的,但如果我那样做的话,他们就不一样了。正如文档所说,索引标题默认为首字母大写,节标题不一定是。保存我的培根!谢谢您在何处添加了ReloadRowsAndExpaths:withRowAnimation:?这是一个非常简单的常见问题解决方案。虽然我确信所有其他答案都是正确的,但这个微妙的错误也会产生同样的错误。值得注意。