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

Seo*_*Lee 10 core-data ios swift

我试图了解如何使用Core Data建模复杂的数据关系.

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

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

Cal*_*leb 15

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

(如果您有数据库管理的背景,这引起您的关注,请不要担心:如果您使用SQLite存储,Core Data会自动为您创建中间连接表.)

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

许多一对多

如果您仍然希望看到如何执行此操作的示例,请搜索"核心数据多对多关系",您会发现很多.你可以从StackOverflow开始; 快速搜索出现了一些例子,包括你如何管理和使用"多对多"核心数据关系?.

更新:从您的评论中,我了解您希望使用中间对象添加有关食谱和成分之间关系的信息.这另一个实体得到保证的情况.所以我们假设您的模型如下所示:

更新的模型

您似乎不太可能想直接获取其中一个RecipeIngredient对象; 你可能只是遵循适当的关系.因此,您可以创建一个获取请求来查找名称与@"chocolate cake"相匹配的所有食谱.(有很多关于使用谓词和文档中的谓词的获取请求的例子,所以我不会在这里做.)你的获取请求将返回我们可以调用的一系列食谱cakeRecipes,但你可能只对一个感兴趣:

Recipe *cake = cakeRecipes.firstObject;
Run Code Online (Sandbox Code Playgroud)

现在,你想知道你的蛋糕成分是什么?这是一个成分列表:

NSArray *ingredientNames = cake.ingredients.ingredient.name;
Run Code Online (Sandbox Code Playgroud)

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

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

或者,您可以使用获取请求来查找与"celery"匹配的成分,并将结果存储在其中celeries.之后,您可能会寻找包括芹菜在内的食谱:

Ingredient *celery = celeries.firstObject;
NSArray *recipes = celery.recipes.recipe
Run Code Online (Sandbox Code Playgroud)

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