【问题标题】: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,所以我想这不会严重影响性能

标签: ios objective-c core-data


【解决方案1】:

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

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

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

【讨论】:

  • 这完全是错误的。现在我正在测试一个应用程序,其中访问关系错误什么都不做。他们不会开火。
  • 访问错误不会执行任何操作,访问相关对象的 属性 会触发错误。重点是,你不应该在意。发生故障是有原因的,它永远不会阻止您查看所需的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2012-02-11
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
相关资源
最近更新 更多