核心数据:父实体与关系

Posted

技术标签:

【中文标题】核心数据:父实体与关系【英文标题】:Core Data: Parent Entity Vs Relationships 【发布时间】:2014-09-14 03:41:41 【问题描述】:

我正在开发一个数据收集应用程序,但我无法理解这些概念之间的联系?这是我的方案: 站点 > 站 > 观测事件

站点有一个属性,一个站点的名称,并且可以包含多个站点。随着时间的推移,每个站都会有多个观测值。我将这些设置为左侧的事件作为父事件,并创建了如图所示的一对多关系,因为每个观察事件都需要使用站点和站点进行标记。

我假设父实体是创建它的最佳方式,还是关系会这样做?我希望用户会提前设置站点/站点数据,然后在制作时填写观测数据。

简而言之,我无法理解关系在核心数据中的作用以及父实体是否是多余的。我只是不清楚核心数据文档。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

本质上,当您生成实体类时,您将看到的是,除了每个实体的属性之外,您还有一个用于“对多”关系的 NSSet。您可以通过集合中的值引用多对多关系中的任何“记录”。

起初看起来很复杂,但后来它完全有意义。因此,如果您想查看站点,您可能会有一个“站点”集,其中包括该站点的每个站点实体的托管对象列表。每个站点将包含一个集合,其中包含每个相关观察的托管对象。

因此,一旦您拥有一个站点实体,您就可以通过以下方式查看该站点的所有站点:

Site *site = (Site *) managedObjectForSite;
for (NSManagedObject *station in site.stations)

     Station *stat = (Station *) station;
     (do what you need to with the station record)

通过将成员添加到给定站点记录的站点集中,您可以将站点与站点“链接”,其中每个成员都是站点的托管对象。您无需“阅读”电台记录的责任——一旦您拥有加载站点的集合成员,这些成员中的每一个实际上都是相关电台的托管对象。

当灯亮起时,它会立刻变得晶莹剔透。你必须完成一次,然后你就会知道那里发生了什么..

请参阅此内容,因为它可能会有所帮助:One-to-Many Relationship: CoreData

【讨论】:

【参考方案2】:

在 Core Data 中,关系具有与经典关系数据库设置中的外键类似的功能。

在数据库中,您可以使用外键“连接”站点、站点和事件实体:

Site .id    = Station .siteID
Station .id = Event   .stationID

在核心数据中,这不是必需的。这两个实体都不需要额外的 ID 属性,您只需定义一对多关系。

Site <--->> Station <---->> Event

优点:您可以从站点访问站点,或者使用透明且高度易读的点符号从站点访问站点,正如您对对象图所期望的那样。您甚至可以方便地从事件对象等中获取站点。

Site  *aStationsSite    = station.site;
NSSet *aSitesStations   = site.stations;
NSSet *aStationsEvents  = station.events;
NSSet *sisterStations   = station.site.stations;
Site  *siteFromEvent    = event.station.site;

【讨论】:

以上是关于核心数据:父实体与关系的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个基于父关系过滤核心数据对象的 NSFetchRequest?

核心数据模型级联删除和父实体

仅在父子实体具有 1 到 M 关系的核心数据中获取父实体的数据

与核心数据的关系错误

获取核心数据中一对多关系的计数

核心数据父实体