核心数据:父实体与关系
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?