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,因此如果您想从数据库中获取人的国家/地区,则必须定义 Person
和 Country
之间的关系。
在这种关系中,您可能会采取一对一的关系。因为一个人将只属于一个国家。当然,一个国家会有很多人,但除非你想展示与特定国家相关的所有人,否则你不需要一对多的关系..
如果您想实现一对多关系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 实体和属性之间的关系的主要内容,如果未能解决你的问题,请参考以下文章