CoreData 预取在属性中没有错误

Posted

技术标签:

【中文标题】CoreData 预取在属性中没有错误【英文标题】:CoreData prefetch not faulting in properties 【发布时间】:2011-12-03 00:08:11 【问题描述】:

我遇到了一个问题,即 CoreData 无法满足对象的错误。我认为这是因为该对象已被删除,现在 CoreData 正试图在某些上下文中访问一个属性并且无法对其进行故障排除。为了解决这个问题,我尝试调用 setRelationshipKeyPathsForPrefetching 并将我想要预取的关系传递给它.

例如,我有一个实体 A,它与实体 B 具有一对多关系,但在某些时候,当我访问实体 B 上的属性时,实体 B 在另一个上下文中被删除,现在故障可以'不满足。

[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"listOfBs", nil]];

我认为如果我这样做,它会预取实体 B,以便我可以安全地调用它的属性,但事实并非如此。

编辑:我似乎找不到任何有关此的信息,但这一定是一个相当普遍的问题。如果某个上下文有一个在另一个上下文中被删除的托管对象,它应该有某种方法可以安全地确定该对象不再存在而不是崩溃

编辑 2:我认为 CoreData 没有正确确认我的预取请求。如果我调用 setRelationshipKeyPathsForPrefetching 而不是返回的对象应该出错,即使在我没有错误的情况下,我也可以简单地打印出返回的对象并查看它们是否出错。 CoreData 不预取多对多关系中的对象吗?

编辑 3:好的,所以也许关系本身是预取的,但预取项的属性没有出错。因此,如果我有实体 A,并且我想预取与 A 关联的所有 B,我使用 setRelationshipKeyPathsForPrefetching 但所有B的属性中没有错误。

【问题讨论】:

你能描述一下发生这种情况的背景吗?而且你只有一个 NSManagedContext 并且你总是在同一个线程上? 我有多个线程/上下文。此外,我有多个正在接触数据库的进程。在某些情况下,我可能会看到不再存在的东西。 我不习惯在多线程上使用 CoreData,不鼓励在多线程上进行修改。知道在最新版本中,Appel 做了一些修改,以便更简单地处理多线程,所以我最好的猜测是 Appel Developer 网站上的 Tech Talk。 【参考方案1】:

想出了一个解决方案。 Core Data 不允许从数据库中进行原子获取,因此如果在预取关系之后发生某些事情,Core Data 会抛出错误。预取关系就是这样做的,预取关系。但不是数据。解决方案是使用 try/catch 并在出现异常时刷新对象。

【讨论】:

以上是关于CoreData 预取在属性中没有错误的主要内容,如果未能解决你的问题,请参考以下文章

ios coredata 会在新版本中更改实体属性导致崩溃

CoreData:使用 NSCKImportOperation 删除传播预取失败

从 CoreData 获取数据时出现“'[AnyObject]' 不可转换为 '[Dog]?'”错误

在 Swift 中将 CoreData 保存/同步到 iCloud

核心数据子上下文不预取关系

核心数据预取和 KVO 合规性