在我正在开发的里程跟踪应用程序中,概念包括“地点”,“腿”和“路线”。从本质上讲,路线是连接腿的集合,其中每条腿只是两个地方之间的直线(具有相关的距离)。
我在Core Data中建立Route-Leg关系时遇到问题,因为Route可能包含两次或更多次相同的Leg。例如,一个人可以在家中办公室,办公室到工地,工地到家,办公室和办公室到家,作为特定日子的单一,连续的旅行路径。在这种情况下,“家到办”腿在路线中包含两次。但是Core Data在NSManagedObject子类中创建To-Many关系作为NSOrderedSet的实例,它不允许重复的Legs。
有没有办法可以在两个Core Data支持的对象(Route和Leg)之间创建一个关系,允许在一个Route中多次出现同一个Leg?我正在Swift中开发我的应用程序,所以任何特定于Swift的建议都会受到赞赏。
谢谢。
答案 0 :(得分:2)
据推测,您目前在Leg
和Route
之间存在多种关系。一种解决方案是用中间实体(比如RouteLegDetails
)替换这种多对多的关系,该实体与Leg
和Route
具有一对一的关系。每个Route
可以包含多个RouteLegDetails
,同样每个Leg
可以包含多个RouteLegDetails
。在数据模型编辑器中,它可能如下所示:
这样,如果您在同一个Leg
上遍历了两次(或更多)Route
,则每个实例都由不同的RouteLegDetails
表示:它克服了对legDetails
的限制Leg
有序集中的重复项。
这会使您的代码稍微复杂化:当您要向Route
添加RouteLegDetails
时,您必须创建一个legDetails
对象,并将其添加到Route
1}} routeDetails
上的Leg
和Leg
关系的关系。相反,要从Route
中删除RouteLegDetails
,您需要删除相应的 transform(
new OpenLayers.Projection("EPSG:4326"); // here
map.getProjectionObject(); // here
);
对象。
答案 1 :(得分:1)
似乎可能有机会改进您的模型对象来解决这一挑战。据我所知,您将无法根据当前建模的内容完全定义路线。你怎么能从它的组成部分完全定义一条路线?由于这种关系本质上是无序的,所以只能通过检查关系来建立一条从腿开始的路线,因为你不知道腿发生的顺序。
一个选项是使用您的腿对象存储订单属性。具有相同起点和终点的腿,但是不同的顺序将是不同的对象。
第二种可能更清洁的方法是将腿的顺序存储在路线对象中(可能作为腿部腿部1 - >腿部3 - >腿部4 - >腿部1 - >的腿部ID列表。腿2)。腿关系会让你所有的腿建立路线,存储在路线对象中的腿顺序属性将允许你从它的腿构建路线,即使你使用相同的两次。数组是通过ID存储分支顺序的明显方法,但是数组不是受支持的核心数据类型,您可能需要考虑将分支ID的顺序存储为可以解析的字符串或可转换属性。见Transformable Attribute