CoreData 保存问题
Posted
技术标签:
【中文标题】CoreData 保存问题【英文标题】:CoreData Saving Issue 【发布时间】:2012-09-20 06:20:21 【问题描述】:我的整个应用程序(包含两个实体)中有一个托管文档,用户可以从两个不同的视图控制器进行更新。每个视图控制器都有自己的 NSFetchedResultsController 属性来传递更改:一个视图控制器中的 UICollectionView 和另一个中的 UITableView。根视图控制器中的 UICollectionView 显示 Teams,而 segued 视图控制器中的 UITableView 显示该团队中的 Players。
当我在第一个视图控制器中时,我可以添加一个团队的实例,它可以正常工作,因为它将它们保存到文档中,然后将它们添加到 UICollectionView。当我在第二个视图控制器中时,我将 Player 插入 CoreData 并调用:
[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];
这会正确调用 NSFetchedResultsControllerDelegate 方法: -(void)controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
在这个委托方法中,我调用:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
但是,在表格视图上调用此行插入方法会导致以下 Core Data 错误:
“CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获了异常。这通常是 NSManagedObjectContextObjectsDidChangeNotification 观察者中的错误。* -[__NSPlaceholderArray initWithObjects:count:]: 尝试使用 userInfo (null) 从 objects[0] 插入 nil 对象"
我的 fetchedResultsController 肯定是 NSManagedObjectContextObjectsDidChangeNotification 的观察者,但是这个错误发生在托管对象上下文发生任何变化之前。所以我基本上无法确定托管对象上下文在什么时候得到 null userInfo。
(发生的另一件事是我的 NSFetchedResultsController 来自具有 UICollectionView 的根视图控制器,在下一个具有 UITableView 的视图控制器中的 NSFetchedResultsController 触发它自己之前触发其委托方法。我认为这是正确的功能,因为团队和玩家都在 CoreData 中获得更新)。
关于为什么 UITableView 行插入会导致此错误,或者我的单个托管文档如何存在可能导致此错误的不一致,有什么想法吗?
【问题讨论】:
【参考方案1】:对于NSFetchedResultsChangeInsert
事件,indexPath
是nil
,newIndexPath
是插入对象的目标路径。因此,您必须致电
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
用于更新事件。
【讨论】:
哇,愚蠢的错误。很棒的地方,但我提供的代码有限。谢谢!【参考方案2】:NSManagedContext 只能使用 'save:error:' 保存 - 你为什么要执行所示的“文档保存”?
【讨论】:
以上是关于CoreData 保存问题的主要内容,如果未能解决你的问题,请参考以下文章