使用多个实体进行 CoreData 编程

Posted

技术标签:

【中文标题】使用多个实体进行 CoreData 编程【英文标题】:CoreData programming with multiple Entities 【发布时间】:2011-01-10 14:15:12 【问题描述】:

我正在寻求有关 CoreData 和一般实体的帮助。就我的问题而言,假设我有一个专辑数据库。我有一个名为专辑的实体,具有名称、艺术家、年份、专辑艺术等属性。

现在,假设我希望能够为这张专辑创作歌曲。我在想我应该为歌曲设置一个单独的实体,并与之建立一对多的关系。但是,我不确定我将如何做到这一点。

由于我有不同的专辑,其中包含不同的歌曲,我想将专辑 A 中的歌曲与专辑 B 分开。现在,我可以在歌曲数据库中为它所属的专辑留一行,但这是最有效的方法去做这个。如果我有重复的专辑名称怎么办。我尝试使用创建时间和名称创建专辑名称的唯一“哈希”,但有没有更好的方法。

我还需要一种更好的方法来处理删除相册时的删除操作。

在不使用一对多关系的情况下,我能够创建两个独立的实体,专辑和歌曲,它们没有链接在一起。但是,当我创建一个新专辑时,它会加载一个新的视图控制器并将“哈希”时间戳专辑名称传递给视图控制器。然后,当我创建一首新歌曲时,它使用该哈希时间戳专辑名称作为 Songs 实体中的一行。这样,当我查看专辑中有哪些歌曲时,我只需设置一个 NSPredicate 以仅显示包含哈希时间戳的查询。但是,删除是一个问题,因为它们没有关系。

    我应该使用“一对多关系”吗? 我应该如何判断一首歌是否属于某个专辑? 如果是多张同名专辑怎么办? 如何处理删除?

如果有人能提供任何这些的答案、代码或教程……将不胜感激。

【问题讨论】:

【参考方案1】:

所以,希望这个简短的回答能让你走上正轨:

一对多的关系适用于专辑->歌曲。至于如何创建它 - 假设您有两个实体,一个名为 "album",一个名为 "song"。在 XCode 的数据模型窗口中,选择您的“专辑”实体并创建一个新关系(点击属性表中的 + 按钮)。

给你的关系一个名字,决定它是否是可选的(假设不是,因为每张专辑都必须至少有一首歌曲),然后选择“song”作为你的目标实体.最后,单击标记为“To-Many relationship”的复选框。就是这样!

现在您已经建立了关系,当您删除专辑本身时,与专辑关联的任何歌曲都将被删除。

关于问题3:“如果有多个同名专辑怎么办”。这是相当常见的情况。使用英文字符串作为您的主要标识符是非常不寻常的。您希望为每张专辑拥有某种唯一 ID——这将是您的主键/唯一键。如果您对这意味着什么感到困惑,那么在继续使用 Core Data 之前,您应该研究一些更基本的数据库概念以便更好地处理它。

【讨论】:

非常感谢您的回复。如果我使用多对多关系,我将如何直接从我的专辑实体访问歌曲。是否有一种方法或方式可以使用该关系来获取和设置歌曲实体中的数据。 关系是实体的属性——您可以像对待任何其他属性一样对待它。您可以通过托管对象的 NSSet 获取/设置。 Apple 的这份指南可能会对您有所帮助:developer.apple.com/library/ios/#documentation/cocoa/Conceptual/…

以上是关于使用多个实体进行 CoreData 编程的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式获取 Core Data 实体描述

如何在 Swift 中使用 UISearchBar 和 NSFetchedResultsController 在 Core Data 上一次获取多个实体?

Core Data 根据是不是存在关系对描述符进行排序?

CoreData & RestKit - 从多个来源获取相同的实体类型

如何使用 Core Data 中多个实体的属性获取属性值?

为不相关的实体集使用和添加多个 Core Data 模型文件