我有一个相当简单的CoreData模型,表示为:
有许多“旅行”可以包含多个图像。另外,单个图像可以多次行进。
我的问题是我想维持它们被添加到Trip中的顺序。通常,我会向保留其ImageData
的{{1}}对象添加一个字段。但是,因为Image可以是任意数量的Trips,所以这没有意义。
在这种情况下,维护索引的简洁方法是什么?
答案 0 :(得分:7)
您在Xcode 4中搜索有序关系复选框。
维护关系的顺序会有性能成本,因此如果您的数据集很大(> 10k个对象),您可能需要考虑传统的排序属性+排序描述符方法。
对于您的特定情况,您最终可能会得到一个中间连接实体,它是Image和Trip之间的连接,即ImageTripOrder,并且与Trip一对一,以及与Image一对一
答案 1 :(得分:1)
处理此问题的旧方法是提供编码订单的链接实体。
Trip{
//...various attributes
images<-->>TripToImage.trip
}
Image{
//...various attributes
trips<-->>TripToImage.image
}
TripToImage{
trip<<-->Trip.images
image<<-->Image.trips
previous<-->TripToImage.next
next<-->TripToImage.previous
}
链接实体正在扩展关系的建模。您可以创建旅行或图像的仲裁顺序。
然而,通过更好的模型设计,这种排序通常是多余的。在这种情况下,如果图像具有特定的日期和位置,它们如何成为多个行程的一部分?你在为时间旅行社建模吗? ; - )
核心数据应该模拟/建模您应用处理的真实对象,事件和条件。真实世界的图像和旅行具有在空间和时间中唯一描述它们的属性。如果您的实体准确捕获所有数据,那么根据属性对它们进行排序就变得微不足道了。
通常,当您必须为任意顺序建模时,您只需要使用链接实体,例如用户最喜欢的排名或其他主观排序。
它会拍摄您想要查看的地点的图像并将其放入列表中 旅行。即不是你亲自拍摄的照片。
您当前的型号很麻烦,因为您没有对问题建模得足够紧密
你真的在创建一个行程,这是一系列的地点和时间,但你试图通过在一个精心设计的关系中将Trip
和Image
对象一起消隐来间接地模拟这些信息。
相反,您需要一个专门为行程建模的实体。
ItineraryStop{
name:string
arrivalTime:date
departureTime:date
location<<-->Location.stops
image<<-->Image.stop
trip<<-->Trip.stop
previousStop<-->IteneraryStop.nextStop
nextStop<-->InteneraryStop.previousStop
}
现在,一切都应该落到实处。为了获得特定旅行的所有停靠点,您可以在旅行中获取并在到达时间点排序,您可以对任何特定的Trip
对象停止进行排序,或者如果没有日期,您可以走这些关系。
在任何情况下,您的模型现在更接近您的应用处理的真实对象,事件或条件。