CoreData故障——如何获取数据

Posted

技术标签:

【中文标题】CoreData故障——如何获取数据【英文标题】:CoreData fault - how to get data 【发布时间】:2014-01-14 04:33:33 【问题描述】:

我研究了大量关于 CoreData 返回错误而不是实际值的问题和文档:

Relationship 'whiskers' fault on managed object (0xb7abab0)

当我试图计算胡须的数量时会发生这种情况,例如:

self.numWhiskersLabel.text = [NSString stringWithFormat:@"%d", cat.whiskers.count];

即使我尝试直接记录胡须集,我仍然会出错:

NSLog(@"whiskers: %@", cat.whiskers);

我了解“在需要访问该对象的实际值之前,核心数据不会返回完整对象。在此之前,您返回的每个对象都将是一个‘故障’。”这很好,但是此时需要访问实际值。我现在需要价值!那么我该如何摆脱这种矛盾呢?怎么能不认为访问Set的count需要value呢?

【问题讨论】:

所以你已经在 Cat 上完成了 fetch 请求,对吧?然后 Cat 对象应该在那里并准备好让您访问胡须。胡须的数据类型是什么? 胡须是什么数据类型?一组 NSManagedObjects? 它在您的标签中显示什么? -- 你获取数据的调用应该可以正常工作,正如你所期望的那样。问题出在其他地方。 你试过[[cat mutableSetValueForKey:@"whiskers"] count] 吗?这里有许多可能出错的地方,其中大部分将在模型对象的实现和/或与胡须对象的关系中。你是用线程限制还是队列限制? 尝试遍历 cat.whiskers 看看是否有。 【参考方案1】:

我没有从我的评论中得到任何反馈,所以我只是假设胡须是一组 NSManagedObjects

最初不会加载该集合,因为在内部它来自数据库中的另一个表。当您访问 .whiskers.count 时,它仍然不需要去获取数据,因为您只需要集合中的晶须数量。

当你从集合中拉出胡须时,它就会出错,尝试这样做

NSLog(@"whiskers: %@", [cat.whiskers.anyObject anyProperty]);

这应该会给你一个加载的 NSManagedObject。

【讨论】:

不,要获得关系中对象的计数,它仍然必须为关系中的对象触发故障。它不必对这些对象的属性触发故障。 cat.whiskers.count 确实是获取关系中对象数量的好方法。出于多种原因,正确使用键值集合运算符、NSExpression 或子查询都是更好的解决方案。 @quellish 这正是我刚才所说的 - 当获取 NSSet 中项目的“计数”时,它将进入数据库并且只选择胡须的 objectID,没有其他属性/列 不,您的陈述“当您访问 .whiskers.count 时,它仍然不需要去获取数据”是误导性的。它仍然必须访问持久存储以满足计数表达式。即使它没有对作为关系目标的对象进行错误处理,它也必须对关系进行错误处理。他的问题出在哪里。【参考方案2】:

这是一个错误条件。 NSManagedObject 实例有问题。在您访问它之前它已被删除,或者您试图从错误的线程中触摸它。

请编辑您的问题并显示访问该NSManagedObject 的代码。

另外,当您在调试器中执行po cat 时会发生什么?您是否看到完整的 Cat 对象,或者这是否也给出了错误错误?

【讨论】:

在这种情况下,NSManagedObject 实例有问题。

以上是关于CoreData故障——如何获取数据的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 故障,当我尝试从 NSSet 为当前用户获取数据时,我收到以下错误。”

在 Core Data 中获取数据时的 performBackgroundTask 故障错误

如何获取指定的 CoreData 值? [关闭]

核心数据故障

如何从coredata中的实体获取过滤数据

如何在后台使用 CoreData 获取数据?