【问题标题】:How can I preserve an ordered list in Core Data如何在 Core Data 中保留有序列表
【发布时间】:2012-02-03 17:44:30
【问题描述】:

我正在编写一个从 Web 服务返回对象列表的 API 方法。此服务还会缓存结果并尝试在再次访问 Web 服务之前返回缓存的结果(如果有)。所以我将此列表存储在核心数据实体中。但是 Core Data 只允许将多对多关系存储在不保留顺序的 NSSet 中。但我希望缓存结果保留原始顺序(最初来自 Web 服务)。我不一定知道该顺序是如何建立的(所以我无法排序)。

那么我怎样才能保留这个订单呢?我的计划是存储一个带有对象 ID 的字符串,以后可以使用它来订购它们:

NSString *objectIds = @"1 5 2 9 4";

这是最好的方法吗?

【问题讨论】:

    标签: objective-c ios cocoa-touch cocoa core-data


    【解决方案1】:

    如果您可以针对 iOS 5,那么您可以使用新的 NSOrderedSet 功能来实现任意排序的 Core Data 关系。有关此新功能的更多信息,请参阅Core Data Release Notes for iOS 5

    如果您必须支持 iOS 4,那么您需要自己处理订购。一种常见的方法是在模型中添加一个整数属性,然后您需要自己管理它。然后,您可以在获取数据时对该属性进行排序。

    将订单存储在完全不同的字符串中似乎是错误的做法。如果排序很重要,则此信息应该在模型中,并且用户应该能够直接查询它(“给我这个特定列表的前五个对象”,或“对象 foo 的索引是什么”)。必须获取一串对象 ID,对其进行解析,然后查询某些对象 ID,这对我来说是非常错误的。

    【讨论】:

    • 实际上,我认为这仅对多对关系有用。
    • @SebastianCelis 这是一个很好的答案,对像我这样第一次学习 iOS 开发的人很有帮助:) 谢谢。
    • 正如其他评论员所说 NSOrderedSet 仅适用于许多关系。此外,iOS 5 的发行说明不再可用。
    【解决方案2】:

    在存储对象的 CoreData 模型中包含您自己的 NSNumber id 字段。 id 将代表您要保留的顺序;显然,您必须自己设置。然后,当您从 CoreData 获取对象时,您可以按该 ID 进行排序。您可能希望/必须将您分配的最高 id 值保持在某个位置,以便在随后的 Web 服务调用和应用启动时保持正确的排序。

    【讨论】:

    • 这可行,但似乎比简单的字符串开销更大,尽管我不确定 Core Data 处理大字符串的效果如何。
    • 虽然对象 id 是一个值,但我相信您可以依靠在背后不改变,使用您自己的 id 字段,其值是从您在其他地方维护的单调递增的主索引设置的更清洁,我想。不过,我完全明白平衡复杂性和便利性的概念。如果您已经将每个对象的数据成员(来自 Web 服务)复制到相应 CoreData 对象的数据成员中,那么为 id 再添加一个字段不会是更多代码。
    • Core Data 在与 mogenerator 结合使用时无法处理 NSOrderedSet,因此此选项虽然成本更高(测试和学习),但效果会更好。
    【解决方案3】:

    这是一个主观问题。您还可以按照您希望的顺序将它们设置为链表。

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2012-09-19
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      相关资源
      最近更新 更多