【发布时间】:2015-05-27 11:45:57
【问题描述】:
我正在尝试了解如何使用 Core Data 对复杂的数据关系进行建模。
在我的应用中,我目前有一个包含食谱、成分和食谱成分的实体,它们将成分绑定到食谱。
我没有遇到任何从这个联合实体中获取数据的示例。如果有人能举一个像我在 Swift 中的 RecipeIngredient 这样的实体的例子,我将不胜感激。
【问题讨论】:
-
什么是你不明白的,你希望从一个例子中学习?
我正在尝试了解如何使用 Core Data 对复杂的数据关系进行建模。
在我的应用中,我目前有一个包含食谱、成分和食谱成分的实体,它们将成分绑定到食谱。
我没有遇到任何从这个联合实体中获取数据的示例。如果有人能举一个像我在 Swift 中的 RecipeIngredient 这样的实体的例子,我将不胜感激。
【问题讨论】:
您没有看到与RecipeIngredient 实体类似的示例的原因是您不需要像 Core Data 中那样的联合实体。您将 Core Data 视为关系数据库,通常使用连接表在实体之间创建高效的多对多关系。正如Core Data Programming Guide 的Many-to-Many Relationships 小节中所解释的,使用Core Data,您需要做的就是在两个实体之间在两个方向上指定一对多关系。请注意文档中的括号内注释:
(如果您有数据库管理方面的背景并且这引起您的担忧,请不要担心:如果您使用 SQLite 存储,Core Data 自动为您创建中间连接表。)
下面是你应该建模的关系图,直接来自 Xcode 的模型编辑器:
如果您仍想查看如何执行此操作的示例,请搜索“核心数据多对多关系”之类的内容,您会发现很多。你可以从 StackOverflow 开始;快速搜索发现了许多示例,包括How do you manage and use "Many to many" core data relationships?。
更新:根据您的评论,我了解到您希望使用中间对象来添加有关食谱和成分之间关系的信息。这是另一个实体的情况。因此,假设您的模型如下所示:
您似乎不太可能想直接获取这些RecipeIngredient 对象之一;你可能只是遵循适当的关系。因此,您可以创建一个获取请求来查找名称与 @"chocolate cake" 匹配的所有食谱。 (在文档和整个网络中有很多使用谓词的获取请求示例,所以我不会在这里这样做。)你的获取请求将返回一个我们可以称为cakeRecipes 的食谱数组,但是你'可能只对一个感兴趣:
Recipe *cake = cakeRecipes.firstObject;
现在,您想了解蛋糕的成分吗?以下是成分列表:
NSArray *ingredientNames = cake.ingredients.ingredient.name;
如果您想记录成分名称和数量:
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 在两种语言中的工作方式相同。
【讨论】: