核心数据 - 具有一对多关系的实体正在检索除“关系”实体之外的所有实体对象的属性

Posted

技术标签:

【中文标题】核心数据 - 具有一对多关系的实体正在检索除“关系”实体之外的所有实体对象的属性【英文标题】:Core Data - Entity with to-many relationship is retrieving all entity object's attributes except "relationship" entity 【发布时间】:2015-11-19 01:06:28 【问题描述】:

我有两个实体,一个叫做“配方”,另一个叫做“成分”。两者之间存在一对多的关系(“recipeIngredients”)。我的问题是,当我尝试从获取的 Recipe 对象中检索成分时,我得到了 nil。所有其他配方对象的属性都可以很好地检索。

我知道/拥有的:

我按照 code.tutsplus.com 上的 Core Data 教程中的说明设置了数据模型。很容易建立一对多的关系;我不认为我搞砸了,但总有机会。从配方到成分的关系是“recipeIngredients”。 通过调试确认成分已正确初始化,因为我看到了它们的指针地址。这些成分被保存到一个 NSSet 中,我使用 setValue:forKey: 方法将它保存到 Recipe 对象中。保存时没有错误。

这是我的保存代码:

NSSet *ingredients = [NSSet setWithObjects:newIngRecipe1, newIng2Recipe1, newIng3Recipe1, newIng4Recipe1, newIng5Recipe1, nil];
[newRecipe1 setValue:ingredients forKey:@"recipeIngredients"];

这是我的检索代码:

Recipe *selectedRecipe = (Recipe *)[self.fetchedResultsController objectAtIndexPath:indexPath];
NSSet *selectedRecipeIngredients = selectedRecipe.recipeIngredients;

我不反对为食谱对象保存成分的其他方法的建议。我可以为食谱创建一个属性来保存一系列成分以使事情变得更容易,但根据我的研究,似乎正确的方法是使用关系。如果还有其他更“正确”的方法可以解决,我很乐意尝试。

【问题讨论】:

关系是双向的吗?您是否生成了托管对象子类?你在保存上下文吗?你为什么不setRecpieIngredients: 你能提供更多代码吗?我假设您在创建后保存?有什么理由不使用 NSManagedObject 子类? 谢谢你们的cmets,伙计们。我最终解决了自己的问题,但是要回答您的问题,是的,这种关系是双向的,并且我确实生成了托管对象子类并保存了上下文。奇怪的是访问器方法不是第一次生成。我重新生成了子类,这次它们弹出了。我现在可以像魅力一样保存和检索成分。 【参考方案1】:

这一定是 Stack Overflow 的魔力,但在我查看了 Apple 自己的 Recipe 应用程序示例后,我最终解决了自己的问题,我在这里找到了该示例:Apple's iPhone Core Data Recipe app example。我向任何使用 Core Data 的人推荐它。我注意到示例食谱应用程序具有用于将成分设置为食谱的访问器方法,而我的则没有,并且这些访问器方法应该是自动生成的。我重新生成了 NSManagedObject 子类,并且 BOOM,有访问器方法可以在 Recipe 类中添加配方成分。使用这些方法正确保存了成分,我现在可以检索它们。我不必对获取方式进行任何更改。

我不知道为什么自动生成的子类一开始就没有方法,但我想答案是确保方法存在,如果没有,再次自动生成。

【讨论】:

以上是关于核心数据 - 具有一对多关系的实体正在检索除“关系”实体之外的所有实体对象的属性的主要内容,如果未能解决你的问题,请参考以下文章

涉及新实体和一对多关系的核心数据迁移

核心数据:删除最后一个具有一对多关系的实体

iOS:删除核心数据中具有一对多关系的实体

快速获取具有一对多关系的核心数据

如何以一对多关系访问数据?

核心数据。加入 2 个具有多对多关系的表?