我正在使用Core Data将信息存储在我正在构建的iPhone应用程序中。
我打算在deck对象中存储词汇表对象,因此任何deck对象都可以有多个词汇表对象。
我想在我的词汇表实体中创建一个属性“Deck ID”,并通过ID将词汇卡与甲板相关联。但是,我不知道这是不是很糟糕?
使用核心数据关系有更好的方法吗?据我所知,关系意味着Deck Entity只有一个Vocabulary对象,也许我错了。
如何有效构建适合我需求的核心数据结构?
感谢。
答案 0 :(得分:2)
这是正确的方法。您不能在实体中“嵌入”实体。
如果您希望deck
实体可以附加vocabulary
个实体的多个实例,则需要为{{1}创建单独的实体和deck
,并在您的vocabulary
实体与deck
实体之间添加 to-many 关系,以及 to-one 从您的vocabulary
实体到您的套牌实体的关系。
以下是Core Data模型中的一对基本实体,用于演示:
正如您在图片中看到的那样,vocabulary
实体与Deck
实体之间存在一个名为vocabularies
的多对多关系,其反比关系为Vocabulary
。< / p>
deck
实体中的vocabularies
关系配置如下:
并且Deck
实体中的deck
关系配置如下:
请注意,Vocabulary
关系为 to-many ,而vocabularies
关系则不是。deck
。这意味着一个Deck
对象可以有多个词汇表,但每个Vocabulary
对象只能连接到一个 {{ 1}}对象。这种关系通常表示为
Deck
这是有意义的,因为你可以看到这与连接两个实体的图像中的箭头相同,表示关系的类型。
核心数据的级别高于直接与数据库交互的级别(它适用于您),因此您实际上不需要将其视为数据库。将Core Data视为 对象图 而不是数据库更容易,因为它代表的是:对象的集合,彼此连接< / strong>,而不是必须手动连接的一组不相交的表。
答案 1 :(得分:1)
核心数据的部分学习曲线是停止将其视为关系数据库。
最好将它视为对象图 - 对象链接在一起的方式,而不是由标识符连接的表。
在你的情况下,你应该做的是拥有一个甲板对象和一个词汇表对象并建立如下关系:
deck <-->> vocabulary
(当人们谈论核心数据时,你会看到很多这种表示法)
这意味着甲板对象与词汇对象具有一对多的关系,词汇对象与甲板对象具有一对一的关系。让这种关系在CD中发挥重要作用。
如果你这样做,就不需要手动创建id和一个连接对象的表,它将在内部为你管理。您需要做的就是从关系中添加和删除对象。对于词汇对象,这只是甲板类型的单个对象,对于甲板,它将是一组词汇类型的对象。将关系双向化意味着,例如,如果您创建一个词汇表对象并将其分配给一个套牌,那么该套牌对象将自动将该词汇表对象添加到其词汇对象集中。