Core Data 实体关系层次结构

Posted

技术标签:

【中文标题】Core Data 实体关系层次结构【英文标题】:Core Data entity relationship hierarchy 【发布时间】:2013-11-20 15:34:50 【问题描述】:

我想在核心数据中设置实体和关系来处理这种情况:

有球队,每个球队可以有多张球队照片和球队中的多名球员……但每个球员也可以有多张照片。 (抱歉,我似乎需要更多的声望点才能发布这段关系的图片。)

如果可以的话,我不确定我是否知道如何正确设置它。在 Photo 实体中,我相信我可以将“forPlayer”和“forTeam”关系设置为可选的。这样做可以让我设置一个或另一个,以便将照片与团队或玩家相关联。

这行得通吗?

现在,如果我将一张照片与一个玩家一个团队相关联会怎样?如果我这样做了,并且我启用了级联删除,那么如果团队或玩家被删除,会不会出现任何问题?

【问题讨论】:

您应该能够链接到上传到其他地方的图像。 对于级联部分,它们不应该都是级联的 - 应该有 1 个所有者。所以在这种情况下你可能根本不应该使用级联。 为什么不创建一个让玩家和团队继承的虚拟基类。然后就没有关系了,你也可以级联。 我想我可以用 TeamPhotoForTeam 建模,然后分别用 TeamPlayerPhotoForPlayer 和级联删除可以工作,但我希望只为照片使用一个实体。 谢谢@rfrittelli ...虽然我的例子过于简单了。实际上,我有几个层次结构和许多不同的实体,所以我不知道基类/父类是否可以工作(或者不知道我将如何设置它)。 【参考方案1】:

我会将PlayerPhotoTeamPhoto 区分为单独的实体。这也是合乎逻辑的,因为在现实世界中,这些照片会完全不同。 (在对实体进行建模时,始终建议尝试尽可能具体。)

PlayerPhotoTeamPhoto 都可以从封装照片数据的Photo 实体继承。大概你会有类似fileNameurl 的属性来表示照片的位置。 (不要在数据库中将照片存储为NSData,因为这仅适用于小图像,例如缩略图。)。

如果您想为球队和球员使用相同的实际照片,您仍然可以拥有两个独立的实体,即使它们在名称/网址方面引用相同的物理照片。级联应该按预期工作,同时保持所有照片文件完好无损。

至于删除不需要的照片,您可以在删除照片实体时考虑这一点,或者使用一种清理方法来删除对象图中未引用的照片。

【讨论】:

以上是关于Core Data 实体关系层次结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 上的 Core Data 中设置新创建的关系?

Core Data中设置实体间关系的原因

层次结构中 JPA 实体之间的双向关系

Core Data Fetch 在插入实体时保存关系(同时)

根据 Swift Core Data 中的关系获取与特定实体相关的所有条目

在 Core Data 中替换多对多关系中的实体