我正在编写一个API方法,它返回Web服务中的对象列表。此服务还会缓存结果并尝试在再次访问Web服务之前返回缓存的结果(如果有)。所以我将此列表存储在Core Data实体中。但是Core Data只允许将to-may关系存储在NSSet中,而NSSet不会保留顺序。但我希望缓存的结果保留原始顺序(最初来自Web服务)。我不一定知道该命令是如何建立的(因此我无法排序)。
那我该如何保存这个订单呢?我的计划是存储一个带有对象id的字符串,我稍后可以使用它来命令它们:
NSString *objectIds = @"1 5 2 9 4";
这是最好的方法吗?
答案 0 :(得分:10)
如果您可以定位iOS 5,那么您可以将新的NSOrderedSet功能用于任意排序的Core Data关系。有关此新功能的详细信息,请参阅Core Data Release Notes for iOS 5。
如果您必须支持iOS 4,那么您需要自己处理订购。执行此操作的常用方法是向模型添加整数属性,然后您需要自行管理。然后,您可以在获取数据时对此属性进行排序。
将订单存储在完全不同的字符串中似乎是错误的方法。如果排序很重要,则此信息应该在模型中,并且用户应该能够直接查询它(“给我这个特定列表的前五个对象”,或“对象foo的索引是什么”)。必须获取一串对象ID,解析它,然后查询某些对象ID对我来说是非常错误的。
答案 1 :(得分:1)
这是一个主观问题。您也可以按照所需的顺序将它们设置为链接列表。
答案 2 :(得分:1)
在CoreData模型中包含您自己的NSNumber id字段,用于存储对象。 id将代表您要保留的顺序;显然,你必须自己设置它。然后,当您从CoreData获取对象时,您可以按该ID进行排序。您可能希望/必须维护您分配的最高ID值,以便在后续Web服务调用和应用程序启动时正确保留订购。