如何为托管对象的关系触发故障

Posted

技术标签:

【中文标题】如何为托管对象的关系触发故障【英文标题】:How to fire fault for a relationship of a Managed Object 【发布时间】:2014-12-29 08:52:27 【问题描述】:

这是我正在使用的模型: CourseProgram <--->> Student --->> Grades

当我从 Core Data 中获取我的 Course Program 托管对象时,它会正确返回 Student,但将 Grades 作为关系错误返回。

我了解 Core Data 会返回关系错误以减少开销。根据Apple documentation,我可以使用setReturnsObjectsAsFaults: 来强制Core Data 返回托管对象而不是故障。

我试过了,没用。每当我执行课程计划的获取请求时,我都无法将成绩作为托管对象获取。我如何为一段关系开火?

这是我用来获取课程项目对象的代码

// Fetch from persistent data store
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"CoursePrograms"];
[fetchRequest setReturnsObjectsAsFaults:YES];

NSArray *coursePrograms = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
return coursePrograms;

【问题讨论】:

为什么要这样做?你能显示“不起作用”的代码吗? @jrturton 更新了我的代码 好的,你为什么要这样做?根据您的对象图,预取所有关系可以一次将每个对象提取到内存中 我需要加载成绩,以便存档和发送数据。无论如何,Course Programs 的 行数 是有限的,不超过 20,所以我想这不会严重影响性能 【参考方案1】:

我认为你不必担心关系会因为错误而卷土重来。只需通过您获得的对象的关系访问它们,就会为您触发错误(转换为完整对象)。

如果您的 fetch 请求返回了一系列课程程序,您可以遍历 students,然后遍历每个学生的成绩。无论是否将它们作为故障提取都不会产生影响,您仍然可以获得数据。

如果您有兴趣,我已经写过关于错误here 的常见误解。

【讨论】:

这完全是错误的。现在我正在测试一个应用程序,其中访问关系错误什么都不做。他们不会开火。 访问错误不会执行任何操作,访问相关对象的 属性 会触发错误。重点是,你不应该在意。发生故障是有原因的,它永远不会阻止您查看所需的数据。

以上是关于如何为托管对象的关系触发故障的主要内容,如果未能解决你的问题,请参考以下文章

如何为 .net 选择对象关系映射

如何为对象计数多个关系创建谓词?核心数据 iOS Swift

如何为给定的代码编写递归关系

您将如何为 MegaProtoUser 实现自我关系?

如何为fuelphp ORM关系设置动态条件

Core Data 如何为关系设置值?