Core Data 中的实体中的实体 - Xcode

Posted

技术标签:

【中文标题】Core Data 中的实体中的实体 - Xcode【英文标题】:Entities within Entities in Core Data - Xcode 【发布时间】:2013-06-18 07:10:00 【问题描述】:

我正在使用 Core Data 将信息存储在我正在构建的 iPhone 应用程序中。

我打算将词汇对象存储在卡片组对象中,因此任何卡片组对象都可以有多个词汇表对象。

我想在我的词汇实体中创建一个属性“Deck ID”,并通过 ID 将词汇卡与甲板关联起来。但是,我不知道这是否是不好的做法?

有没有更好的方法来处理 Core Data 关系?据我所知,关系意味着 Deck Entity 将只有一个 Vocabulary 对象,也许我错了。

我如何才能有效地构建满足我需求的核心数据结构?

谢谢。

【问题讨论】:

【参考方案1】:

这是正确的做法。您不能将实体“嵌入”到实体中。

如果您希望拥有一个可以附加多个vocabulary 实体实例的deck 实体,您需要为deckvocabulary 创建单独的实体,并将deck 实体与vocabulary 实体之间的对多 关系添加到vocabulary 实体中,并将​​vocabulary 实体中的对一 关系添加回您的牌组实体。

以下是核心数据模型中的一对基本实体来证明这一点:

如图所示,Deck 实体与Vocabulary 实体之间存在名为vocabularies 的一对多关系,以及deck 的反向关系。

Deck 实体中的vocabularies 关系配置如下:

Vocabulary实体中的deck关系是这样配置的:

请注意,vocabularies 关系是to-many,而deck 关系不是。这意味着一个Deck对象可以有多个词汇表,但每个Vocabulary对象只能连接到一个Deck对象强>。这种类型的关系通常表示为

Deck <---->> Vocabulary

这是有道理的,因为您可以看到这与上图中连接两个实体的箭头相同,表示关系类型。

Core Data 比直接与数据库交互(它为您服务)处于更高的级别,因此您真的不需要将其视为数据库。将 Core Data 视为对象图而不是数据库更容易,因为它代表的是:对象的集合,相互连接,而不是一组必须手动连接的不相交的表。

【讨论】:

非常感谢!这真的很有帮助。如果我为 Deck 和 Vocabulary 创建类,我如何将 Vocabulary 实体实例化或添加到特定的 Deck?有什么方法可以让我做到这一点吗? @Yoni201 当您为Deck 创建一个类时,您会注意到它有一个名为vocabulariesNSSet 属性,以及一个带有您的方法的对象上的CoreDataGeneratedAccessors 类别可以用来添加和删除这个集合中的对象,所有这些都是为你制作的。你不需要自己实现任何东西。 我如何获取所有绑定到一副牌的词汇对象?我已成功获取卡片组,但我不知道如何获取卡片组中的词汇对象。 只需访问您的Deck 对象的vocabularies 属性。它是一个NSSet,包含与之关联的所有词汇对象。 没有。获取Deck 对象将获取它们所引用的所有对象。【参考方案2】:

Core Data 学习曲线的一部分是停止将其视为关系数据库。

最好将其视为对象图 - 对象链接在一起的方式,而不是通过标识符连接的表格。

在你的情况下,你应该做的是有一个甲板对象和一个词汇对象,并像这样建立关系:

deck <-->> vocabulary

(当人们谈论 Core Data 时,你会经常看到这种表示法)

这意味着牌组对象与词汇对象具有一对多的关系,而词汇对象与牌组对象具有一对一的关系。在 CD 中,双方的关系很重要。

如果您这样做,则无需手动创建 id 和连接对象的表,它将在内部为您管理。您需要做的就是在关系中添加和删除对象。对于 Vocabulary 对象,这将只是一个卡片组类型的对象,而对于卡片组,它将是一组词汇表类型的对象。双向关系意味着,例如,如果您创建一个词汇对象并将其分配给一个卡片组,那么卡片组对象将自动将此词汇对象添加到其词汇对象集中。

【讨论】:

以上是关于Core Data 中的实体中的实体 - Xcode的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 数据模型中的订单实体

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

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

如何从 Core Data 中的关系相关实体获取属性?

在 Core Data 中的相关实体之间传递数据时的空值

如果Core Data count / fetch请求中的实体名称错误,如何避免崩溃?