CoreData 实体和属性之间的关系

Posted

技术标签:

【中文标题】CoreData 实体和属性之间的关系【英文标题】:CoreData Relationship between entities and attributes 【发布时间】:2012-03-29 13:29:59 【问题描述】:

我在掌握 CoreData 关系时遇到了一点麻烦,我注意到我应该在我的 2 个实体之间使用哪种关系类型,或者我的逻辑是否正确。

1) “Person”实体 - 姓名、电话、地址、国家等属性...

2) “CountryList” - countryName、countryLat、countryLong 等属性。

CountryList 实体在应用首次运行时预先填充,以包含世界上所有国家/地区及其受尊重的数据。

我被困的地方是我需要这两个实体之间的关系吗?

我将允许用户从 CountryList 实体数据中选择一个国家,并希望将选择存储在 Person 实体的国家属性中。

我是否只是将 CountryList 中的 countryName 作为字符串并将其存储在来自 Person 的国家/地区?或者我可以在他们之间建立关系吗?

我知道一个用户只能属于一个国家,但一个国家可以有很多用户,所以这是一对多的关系吗?或者是多对多,因为很多用户可以属于一个国家,但一个国家可以有很多用户?糊涂了!

有人可以在这方面启发我,并指出我应该在 xcode 中做什么的正确方向。

提前致谢 马特

编辑:这是正确的吗?

我已经对实体名称等进行了更改,并且认为我现在已经正确设置了关系。

编辑 2:删除国家属性并重命名关系

【问题讨论】:

如果您对如何实现关系感到困惑,请告诉我。我目前只从事 Core Data 的工作,并做了所有这些工作。所以总是乐于提供帮助。:-)) 现在看起来不错,但正如我所说,重命名关系。此外,您将不再需要“Person”中的“country”属性 【参考方案1】:

首先,您的“CountryList”实体应该被称为“Country”,因为它只代表一个国家。您拥有许多这些国家的事实与其名称无关。

之后,使用关系似乎很自然,一个“人”有一个“国家”,但一个国家可以有很多人。因此,一对多的关系。使用关系将简化您可能想要执行的许多操作(即访问一个人的所有国家/地区信息,或获取位于某个特定国家/地区的所有人的列表)。

哦,这可能有助于您更好地理解关系:CoreData 本身没有“多对多”关系。您始终定义从源到目标的关系。因此,如果您定义从 Country 到 Person 的关系,这将是一对多的关系。一国,多人。然后,您可以定义从 Person 到 Country 的关系,这将是一对一的关系。一个人,一个国家。如果您将其定义为一对多关系,那么您最终会得到一个事实上的多对多关系(因为一个人可以有很多国家,一个国家可以有很多人)。它并不像看起来那么复杂。

现在,在您定义了两个关系之后,您可以将它们设置为彼此的“反向关系”。为其中一种关系执行此操作,另一种将自动设置。完成此操作后,CoreData 会在您将人员添加到国家/地区列表时更新该人员的国家/地区。

更多信息请参见https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html

【讨论】:

请看我的回答,如果我的建议是错误的,请提示。 @JiaYow 非常感谢,我认为这是我有点困惑的地方,将 CoreData 视为数据库并假设实体就像表。我知道情况并非如此,但很难不去想。所以在 xcode 中,我选择 Person 实体并创建关系 countryRel,然后选择 Country 实体并创建 personRel 并设置它们的 Inverse。然后在 Country 实体下选择 personRel 关系,然后选择 To-Many 关系?我认为这似乎是正确的。 是的。但跳过“Rel”部分。将关系分别称为“国家”和“人”(您将有很多人,因此是复数)。使用起来更加直观 @JiaYow 再次感谢,很高兴不仅有答案,而且您还提供了一些“最佳实践”建议:D 请检查我原始帖子中的屏幕截图,看看我现在是否正确。我将在我的项目中更改关系名称 @JiaYow 我无法调用关系国家,因为我在 Person 实体中有一个国家属性。对吗?【参考方案2】:

CountryList 应该只是 Country

然后在 Person.county 和 Country 之间设置“多对一”关系

【讨论】:

【参考方案3】:

您正在使用 Core Data,因此如果您想从数据库中获取人的国家/地区,则必须定义 PersonCountry 之间的关系。

在这种关系中,您可能会采取一对一的关系。因为一个人将只属于一个国家。当然,一个国家会有很多人,但除非你想展示与特定国家相关的所有人,否则你不需要一对多的关系..

如果您想实现一对多关系this 教程链接可能有助于您理解一对多关系..

http://www.theappcodeblog.com/2011/09/29/iphone-app-development-tutorial-core-data-part-2-one-to-many-relationship/

【讨论】:

请注意,这适用于关系 Person->Country,而不适用于 Country->Person(如果他也想要的话) @JiaYow : 是的,这就是我想说的,但我用一点难懂的语言解释了它。谢谢哥们.. :-)) 我确实希望能够获取特定国家/地区的所有人员。所以它是一对多的? 是的..比..您必须从右侧的模型检查员那里检查该选项的多对多关系...

以上是关于CoreData 实体和属性之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

ios coredata 会在新版本中更改实体属性导致崩溃

两个 CoreData 实体之间可以有多个“对多”关系吗?

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

如何在 Coredata 中的相同实体之间创建多个关系?

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

如何在 CoreData 中对实体之间的相对分数进行建模