Core data 核心数据:具有重复值的多个关系

Core data 核心数据:具有重复值的多个关系,core-data,swift2,Core Data,Swift2,在我正在开发的里程跟踪应用程序中,这些概念包括“地点”、“腿”和“路线”。从本质上说,路线是连接腿的集合,其中每条腿只是两个地点之间的一条直线(具有相关距离) 我在核心数据中建模路由分支关系时遇到问题,因为一条路由可能包含同一分支两次或两次以上。例如,一个人可以在给定的一天作为一条单一的、连续的旅行路径,从家到办公室、从办公室到工地、从工地到家、从家到办公室、从办公室到家。在这种情况下,“从家到办公室”的分支在路线中包含两次。但是核心数据在NSManagedObject子类中创建了多对多关系,作

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

我在核心数据中建模路由分支关系时遇到问题,因为一条路由可能包含同一分支两次或两次以上。例如,一个人可以在给定的一天作为一条单一的、连续的旅行路径,从家到办公室、从办公室到工地、从工地到家、从家到办公室、从办公室到家。在这种情况下,“从家到办公室”的分支在路线中包含两次。但是核心数据在NSManagedObject子类中创建了多对多关系,作为NSOrderedSet的实例,这不允许重复的分支

是否有一种方法可以在两个核心数据支持对象(路由和分支)之间创建一种关系,允许同一分支在一条路由中多次出现?我正在用Swift开发我的应用程序,因此任何Swift的具体建议都将不胜感激


谢谢。

似乎有机会改进模型对象以解决此难题。据我现在所知,您将无法根据当前建模的内容完全定义路线。如何从其组成支腿完全定义路线?由于关系本身是无序的,因此仅通过检查关系无法从腿构建路由,因为您将不知道腿的发生顺序

一个选项是将order属性与leg对象一起存储。起点和终点相同,但顺序不同的腿是不同的对象


第二种可能更简洁的方法是将支腿的顺序存储在route对象中(可能作为支腿ID的列表leg 1->leg 3->leg 4->leg 1->leg 2)。legs关系将使所有支腿都可以构建路由,存储在route对象中的leg order属性将允许您从其支腿构建路由,即使您两次使用相同的支腿。数组是用ID存储腿的顺序的明显方式,但是数组不是支持的核心数据类型,您可能需要考虑将腿ID的顺序存储为可以解析的字符串或可转换属性。请参见

似乎有机会改进模型对象以解决此难题。据我现在所知,您将无法根据当前建模的内容完全定义路线。如何从其组成支腿完全定义路线?由于关系本身是无序的,因此仅通过检查关系无法从腿构建路由,因为您将不知道腿的发生顺序

一个选项是将order属性与leg对象一起存储。起点和终点相同,但顺序不同的腿是不同的对象


第二种可能更简洁的方法是将支腿的顺序存储在route对象中(可能作为支腿ID的列表leg 1->leg 3->leg 4->leg 1->leg 2)。legs关系将使所有支腿都可以构建路由,存储在route对象中的leg order属性将允许您从其支腿构建路由,即使您两次使用相同的支腿。数组是用ID存储腿的顺序的明显方式,但是数组不是支持的核心数据类型,您可能需要考虑将腿ID的顺序存储为可以解析的字符串或可转换属性。请参见

大概您目前在
支腿
路线
之间有很多关系。一种解决方案是用一个中间实体(例如
RouteLegDetails
)替换这种多对多关系,该中间实体与
Leg
Route
具有一对一的关系。每个
Route
可以有许多
RouteLegDetails
,同样,每个
Leg
也可以有许多
RouteLegDetails
。在数据模型编辑器中,它可能如下所示:

这样,如果在同一条
路线上有一条
支腿
经过两次(或更多次),则每个实例都由不同的
RouteLegDetails
表示:这克服了
legDetails
有序集中对重复项的限制


这将使您的代码稍微复杂化:当您想将
支腿
添加到
路线
时,您必须创建一个
路由详细信息
对象,并将其添加到
路线
上的
支腿
关系和
支腿
上的
路由详细信息
关系中。相反地,要从
路线
中删除
支腿
,则需要删除相应的
RouteLegDetails
对象。

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

这样,如果在同一条
路线上有一条
支腿
经过两次(或更多次),则每个实例都由不同的
RouteLegDetails
表示:这克服了
legDetails
有序集中对重复项的限制

这将使您的代码稍微复杂化:当您想要将
支腿添加到
路线
时,您必须创建
路线详细信息
对象,并将其添加到
路线
上的
支腿
关系和
路线详细信息
关系中