核心数据:具有重复值的多对多关系

时间:2016-05-11 15:54:14

标签: core-data swift2

在我正在开发的里程跟踪应用程序中,概念包括“地点”,“腿”和“路线”。从本质上讲,路线是连接腿的集合,其中每条腿只是两个地方之间的直线(具有相关的距离)。

我在Core Data中建立Route-Leg关系时遇到问题,因为Route可能包含两次或更多次相同的Leg。例如,一个人可以在家中办公室,办公室到工地,工地到家,办公室和办公室到家,作为特定日子的单一,连续的旅行路径。在这种情况下,“家到办”腿在路线中包含两次。但是Core Data在NSManagedObject子类中创建To-Many关系作为NSOrderedSet的实例,它不允许重复的Legs。

有没有办法可以在两个Core Data支持的对象(Route和Leg)之间创建一个关系,允许在一个Route中多次出现同一个Leg?我正在Swift中开发我的应用程序,所以任何特定于Swift的建议都会受到赞赏。

谢谢。

2 个答案:

答案 0 :(得分:2)

据推测,您目前在LegRoute之间存在多种关系。一种解决方案是用中间实体(比如RouteLegDetails)替换这种多对多的关系,该实体与LegRoute具有一对一的关系。每个Route可以包含多个RouteLegDetails,同样每个Leg可以包含多个RouteLegDetails。在数据模型编辑器中,它可能如下所示:

enter image description here

这样,如果您在同一个Leg上遍历了两次(或更多)Route,则每个实例都由不同的RouteLegDetails表示:它克服了对legDetails的限制Leg有序集中的重复项。

这会使您的代码稍微复杂化:当您要向Route添加RouteLegDetails时,您必须创建一个legDetails对象,并将其添加到Route 1}} routeDetails上的LegLeg关系的关系。相反,要从Route中删除RouteLegDetails,您需要删除相应的 transform( new OpenLayers.Projection("EPSG:4326"); // here map.getProjectionObject(); // here ); 对象。

答案 1 :(得分:1)

似乎可能有机会改进您的模型对象来解决这一挑战。据我所知,您将无法根据当前建模的内容完全定义路线。你怎么能从它的组成部分完全定义一条路线?由于这种关系本质上是无序的,所以只能通过检查关系来建立一条从腿开始的路线,因为你不知道腿发生的顺序。

一个选项是使用您的腿对象存储订单属性。具有相同起点和终点的腿,但是不同的顺序将是不同的对象。

第二种可能更清洁的方法是将腿的顺序存储在路线对象中(可能作为腿部腿部1 - >腿部3 - >腿部4 - >腿部1 - >的腿部ID列表。腿2)。腿关系会让你所有的腿建立路线,存储在路线对象中的腿顺序属性将允许你从它的腿构建路线,即使你使用相同的两次。数组是通过ID存储分支顺序的明显方法,但是数组不是受支持的核心数据类型,您可能需要考虑将分支ID的顺序存储为可以解析的字符串或可转换属性。见Transformable Attribute

相关问题