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 事件,indexPathnilnewIndexPath 是插入对象的目​​标路径。因此,您必须致电

[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                      withRowAnimation:UITableViewRowAnimationAutomatic];

用于更新事件。

【讨论】:

哇,愚蠢的错误。很棒的地方,但我提供的代码有限。谢谢!【参考方案2】:

NSManagedContext 只能使用 'save:error:' 保存 - 你为什么要执行所示的“文档保存”?

【讨论】:

以上是关于CoreData 保存问题的主要内容,如果未能解决你的问题,请参考以下文章

不保存上下文的 CoreData 保存

在CoreData中保存数组的值时,只保存一个值

保存 CoreData 上下文和绑定问题

将 NSData 数组保存到 CoreData

CoreData:在保存文档之前合并两个上下文

应用更新 CoreData 保存了吗?