iOS Swift – 具有复杂数据关系的核心数据示例

我想了解如何build立与核心数据的复杂数据关系。

与我的应用程序,我目前有一个配方,成分和RecipeIngredient实体配料的配方。

我还没有遇到任何从这个联合实体中提取数据的例子。 我会很感激,如果有人可以给我一个像Swift的RecipeIngredient实体的例子。

你没有看到类似于RecipeIngredient实体的例子的原因是你不需要像Core Data那样的联合实体。 您将Core Data视为关系数据库,通常使用连接表来创build实体之间高效的多对多关系。 如“ 核心数据编程指南”的“ 多对多关系”子节中所解释的,使用核心数据,您只需在两个实体之间的双向指定多对多关系即可。 请注意文档中的括号注释:

(如果您拥有数据库pipe理的背景,并且引起您的担忧,请不要担心:如果您使用SQLite存储,Core Data会自动为您创build中间连接表。

下面是你应该build模的关系图,从Xcode的模型编辑器直接剥离:

许多一对多

如果你仍然想看到如何做到这一点的例子,search“核心数据多对多关系”的东西,你会发现很多。 你可以从StackOverflow开始 快速search出现了一些例子,包括如何pipe理和使用“多对多”的核心数据关系? 。

更新:从你的评论,我明白,你想使用一个中间对象来添加食谱和配料之间的关系的信息。 这另一个实体的保证。 所以我们假设你的模型是这样的:

更新的模型

您似乎不太可能想要直接获取这些RecipeIngredient对象之一; 你可能只是按照适当的关系。 因此,您可能会创build一个提取请求来查找名称与“巧克力蛋糕”相匹配的所有食谱。 (有很多使用谓词在文档中的提取请求的例子,所以我不会在这里做。)你的提取请求将返回一个我们可以称为cakeRecipes的食谱数组,但是你大概只对一个感兴趣:

 Recipe *cake = cakeRecipes.firstObject; 

现在,你想知道你的蛋糕配料是什么? 以下是成分列表:

 NSArray *ingredientNames = cake.ingredients.ingredient.name; 

如果您想logging配料名称和金额:

 for (RecipeIngredient *i in cake.ingredients) { NSLog(@"%@ %@", i.amount, i.ingredient.name); } 

或者,您可以使用提取请求来查找匹配“芹菜”的成分,并将结果存储在celeries 。 之后,你可能会寻找食谱,包括芹菜:

 Ingredient *celery = celeries.firstObject; NSArray *recipes = celery.recipes.recipe 

如果这没有帮助,也许你可以更具体的问题。 另外,我知道你问的是Swift,但我的手指仍然习惯于Obj-C,而这些语言细节在这里并不真正起作用 – Core Data在两种语言中都是一样的。