【问题标题】:CoreData maintain relationship orderCoreData 维护关系顺序
【发布时间】:2011-07-21 13:09:55
【问题描述】:

我有一个相当简单的 CoreData 模型,表示为:

有许多“旅行”可以包含多张图片。此外,单个图像可以在多个行程中。

我的问题是我想保持将它们添加到旅行的顺序。通常,我会向ImageData 对象添加一个字段,以维护其index。但是,因为图像可以在任意数量的行程中,所以这没有意义。

在这种情况下维护索引的干净方法是什么?

【问题讨论】:

    标签: sorting core-data


    【解决方案1】:

    您在 Xcode 4 中寻找有序关系复选框。

    维护关系的顺序会带来性能成本,因此如果您的数据集很大(>10k 个对象),您可能需要考虑传统的排序属性 + 排序描述符方法。

    对于您的具体情况,您可能最终会得到一个中间连接实体,它是 Image 和 Trip 之间的连接,即 ImageTripOrder,并且与 Trip 一对一以及与 Image 一对一.

    【讨论】:

    • 我认为是 Xcode 4.1?它不会在 4.02 中与 iOS sdk 一起显示。
    • 我确实在 4.1 中看到了它。这是否需要模型迁移,或者我可以只选中该框并使用旧数据吗?数据集不能太大,但对“Ordered”选项一无所知,在网上找不到任何信息。
    • 我不确定它在哪个版本的 Xcode 中,似乎是 4.1 或更高版本。 @MarkPowell,您可以选中该框。我相信 Core Data 会对现有数据进行轻量级(推断)迁移,以将其转换为有序关系。
    【解决方案2】:

    处理此问题的旧方法是提供一个对订单进行编码的链接实体。

    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
    }
    

    链接实体正在扩展关系的建模。您可以创建行程或图像的任意顺序。

    但是,通过更好的模型设计,通常可以使这种排序变得多余。在这种情况下,如果图像具有特定的日期和位置,它们如何成为不止一次旅行的一部分?你在做一个时间旅行机构的模特吗? ;-)

    Core Data 应该模拟/建模您的应用处理的真实世界对象、事件和条件。真实世界的图像和旅行具有在空间和时间上唯一描述它们的属性。如果您的实体准确地捕获了所有这些数据,那么根据属性对它们进行排序就变得微不足道了。

    通常,当您必须对任意顺序(例如用户最喜欢的排名或其他主观排序)进行建模时,您才需要使用链接实体。

    更新:

    它会拍摄您想去的地方的图片并将它们放在一个列表中 去旅行。 IE。不是您亲自拍摄的图像。

    您当前的模型很麻烦,因为您对问题的建模不够紧密。
    您实际上是在创建一个包含一系列位置和时间的行程,但是您试图通过将TripImage 对象以一种复杂的关系组合在一起来间接地对这些信息进行建模。

    相反,您需要一个专门为行程建模的实体。

    ItineraryStop{
        name:string
        arrivalTime:date
        departureTime:date
        location<<-->Location.stops
        image<<-->Image.stop
        trip<<-->Trip.stop
        previousStop<-->IteneraryStop.nextStop
        nextStop<-->InteneraryStop.previousStop
    }
    

    现在,一切都已经到位。要为特定行程获取所有停靠点,您可以在行程中获取并按到达时间排序,您可以对任何特定的 Trip 对象停靠点进行排序,或者如果没有日期,您可以遍历关系。

    无论如何,您的模型现在更接近于您的应用处理的真实世界对象、事件或条件。

    【讨论】:

    • 虽然时间旅行公司会很棒,但它有点平凡。它会拍摄您想看的地方的图像,并将它们放在旅行列表中。 IE。不是您亲自拍摄的图像。
    • 如果使用这种方法,头尾应该如何管理?只需使用一个 NSPredicate 来检查 "next=nil" 的尾部和 "previous=nil" 的头部吗?
    • 您可能不必使用谓词,因为您将从Image 对象或Trip 对象开始,然后您会自动拥有一组关联的TripToImage 对象。我通常在排序对象中有一个方法,告诉他们只需通过从随机排序对象开始的上一条/下一条路径来找到头部或尾部。这适用于几十个对象。
    • 不要害怕添加中间对象来建模复杂的关系。有时,现实世界对象之间的关系比对象本身更复杂,而且这种关系需要一个或多个实体来捕捉现实世界的复杂性。
    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多