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
实体,您需要为deck
和vocabulary
创建单独的实体,并将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
创建一个类时,您会注意到它有一个名为vocabularies
的NSSet
属性,以及一个带有您的方法的对象上的CoreDataGeneratedAccessors
类别可以用来添加和删除这个集合中的对象,所有这些都是为你制作的。你不需要自己实现任何东西。
我如何获取所有绑定到一副牌的词汇对象?我已成功获取卡片组,但我不知道如何获取卡片组中的词汇对象。
只需访问您的Deck
对象的vocabularies
属性。它是一个NSSet
,包含与之关联的所有词汇对象。
没有。获取Deck
对象将获取它们所引用的所有对象。【参考方案2】:
Core Data 学习曲线的一部分是停止将其视为关系数据库。
最好将其视为对象图 - 对象链接在一起的方式,而不是通过标识符连接的表格。
在你的情况下,你应该做的是有一个甲板对象和一个词汇对象,并像这样建立关系:
deck <-->> vocabulary
(当人们谈论 Core Data 时,你会经常看到这种表示法)
这意味着牌组对象与词汇对象具有一对多的关系,而词汇对象与牌组对象具有一对一的关系。在 CD 中,双方的关系很重要。
如果您这样做,则无需手动创建 id 和连接对象的表,它将在内部为您管理。您需要做的就是在关系中添加和删除对象。对于 Vocabulary 对象,这将只是一个卡片组类型的对象,而对于卡片组,它将是一组词汇表类型的对象。双向关系意味着,例如,如果您创建一个词汇对象并将其分配给一个卡片组,那么卡片组对象将自动将此词汇对象添加到其词汇对象集中。
【讨论】:
以上是关于Core Data 中的实体中的实体 - Xcode的主要内容,如果未能解决你的问题,请参考以下文章