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

时间:2015-03-24 08:31:57

标签: ios swift core-data

我正在尝试了解如何使用Core Data建模复杂的数据关系。

通过我的应用程序,我目前有一个Recipe,Ingredient和RecipeIngredient的实体,它将成分与食谱结合起来。

我没有遇到过从这个联合实体中获取数据的任何示例。如果有人能像Swift中的RecipeIngredient这样的实体给出一个例子,我会很感激。

1 个答案:

答案 0 :(得分:15)

您没有看到类似于RecipeIngredient实体的示例的原因是您不需要核心数据中的联合实体。您将Core Data视为关系数据库,您通常使用连接表来创建实体之间的有效多对多关系。正如Many-to-Many RelationshipsCore Data Programming Guide子部分所述,使用核心数据,您需要做的就是在两个实体之间指定两个方向之间的多对多关系。请注意文档中的括号注释:

  

(如果你有数据库管理的背景,这引起你的关注,请不要担心:如果你使用SQLite商店,核心数据   自动为您创建中间联接表。)

以下是您应该对其进行建模的关系的说明,直接从Xcode的模型编辑器中删除:

many-to-many

如果您仍希望看到如何执行此操作的示例,请搜索类似"核心数据的多对多关系"而且你会发现很多。你可以从StackOverflow开始;快速搜索出现了一些例子,包括How do you manage and use "Many to many" core data relationships?

更新:根据您的评论,我了解您希望使用中间对象添加有关食谱和配料之间关系的信息。 是另一个实体得到保证的情况。所以,让我们说你的模型是这样的:

updated model

您似乎不太可能想直接获取其中一个RecipeIngredient个对象;你可能只是遵循适当的关系。因此,您可以创建一个获取请求来查找名称与@"巧克力蛋糕"匹配的所有食谱。 (在文档和整个网络中都有很多使用谓词的获取请求的例子,所以我不会在这里做到这一点。)你的获取请求将返回一个我们可以调用{{1}的配方数组。 },但你可能只对一个感兴趣:

cakeRecipes

现在,您想知道蛋糕的成分是什么?这是一份成分清单:

Recipe *cake = cakeRecipes.firstObject;

如果您想记录成分名称和数量:

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

或者,您可以使用获取请求来查找匹配" celery"的成分,将结果存储在for (RecipeIngredient *i in cake.ingredients) { NSLog(@"%@ %@", i.amount, i.ingredient.name); } 中。之后,你可能会寻找包括芹菜的食谱:

celeries

如果这没有帮助,也许你可以更具体地解决这个问题。另外,我知道你要求使用Swift,但是我的手指仍然习惯于Obj-C,语言细节并没有真正发挥作用 - 核心数据在两种语言中都是一样的。