8

不确定这是否是 Magical Record 保存方式的问题,或者我只是在某个地方犯了一个菜鸟错误。

我正在使用 NSFetchedResultController (FRC) 和 UITableView 来显示实体列表,当用户点击“添加”带有编辑器的新视图控制器时,会使用[MyEntity MR_createEntity]. 用户可以在此处添加通过关系添加到主实体的其他实体。当用户在此视图控制器中点击“保存”时,上下文将使用[[NSManagedObjectContext MR_contextForCurrentThread] MR_save]

NSFetchedResultsController 似乎更新了,但是当我点击编辑实体时,没有任何子实体存在。调试似乎表明,即使实体已被保存,FRC 仍然具有具有其临时 ID 的实体。

[self.tableView reloadData]在 FRCcontrollerDidChangeContent委托方法中做得很幼稚。

重新启动应用程序会加载正确的实体,并且子实体会在编辑器视图控制器中正确显示。

看起来 FRC 响应了“主线程”保存事件,但保存实际上是在后台线程上发生的,因此 FRC 看不到它。我已经检查过,所有“我的”操作(设置 FRC、创建和获取实体)都发生在主线程上下文中。

我尝试在 MR_rootSavingContext 上侦听更改通知,并将它们与主线程上下文合并,这有点工作,但我最终在 FRC 中得到了重复的行(一个是正确的“永久”实体,一个是临时实体)。

4

2 回答 2

8

好的,我不确定这是否是“正确的方法”,但我发现如果我在 MR_rootSavingContext 中创建 NSFetchedResultsController 而不是使用MR_fetchAllSortedBy.

我想从 FRC 现在正在观看 rootSavingContext 而不是其中一个孩子的角度来看,这是有道理的。尽管如此,我还是会想到,因为我在同一个线程上进行所有操作,这不会成为问题。

更新:这种方法的唯一问题是,如果我只是抓住实体[frc objectAtIndexPath:]用于将其提供给编辑视图控制器,那么它不再处于默认上下文中。通过使用 NSManagedObjectContext 重新获取默认上下文中的实体来解决此问题existingObjectWithID。仍然感觉并不完全正确,但它对我有用。

于 2012-06-11T05:35:21.137 回答
0

知道这是一个旧答案,但以上都不适合我,希望能帮助未来的读者

对我来说,问题是由于尝试使用以前与 iCloud 一起使用的 sqlite 文件设置纯本地存储引起的。

Basically I tried to implement iCloud with my CoreData app, did the basic steps to set it up with an ubiquity container etc but then reverted back because of the inherent instability this seemed to cause (why is it that CoreData and iCloud STILL dont get along?!), but cocoa doesn't like you backtracking like that.

Fortunately I haven't done this in a live app so it's relatively easy to change as it will only affect development devices, but if you're moving from iCloud to a local store in a live app I think you might need to check out one of these solutions:

Migrating a Core Data Store from iCloud to local

于 2013-04-17T01:43:27.667 回答