默认情况下,核心数据提取(NSFetchRequest)是否以任何特定方式排序?

时间:2009-05-20 13:50:23

标签: cocoa core-data

我有一个基本问题。假设您要在NSManagedObjectContext上执行NSFetchRequest。如果获取请求没有明确设置任何排序描述符,那么每次对象是随机的,还是按照最初添加到托管对象上下文的顺序将它们吐出到数组中?我在文档中的任何地方都找不到这个答案。

4 个答案:

答案 0 :(得分:3)

不,他们不能保证订购。您可能会看到一致的排序,具体取决于您使用的数据存储类型(我从未尝试过),但这不是您应该依赖的东西。

虽然创建日期很容易订购。只需向您的实体添加日期属性,将其初始化为awakeFromInsert中的当前日期,并在获取中指定该排序描述符。

答案 1 :(得分:0)

我在这里看到两个问题:每次都会以相同的顺序出现吗?并且,是按订单排序吗?

按照设定的顺序出现,这是按照某种顺序排列的。请注意,NSSet只是一个接口,并且存在实现NSSet的私有类。这意味着,虽然如果你反对调用allObjects,你会得到一些NSSet实例,但是它可能会以一致的顺序返回它们,它几乎可以肯定是在散列顺序中,因为集合几乎普遍被实现为散列字典。

由于散列算法的变化很大,具体取决于存储的内容以及散列的方式,因此每次都可以“运气好”它以相同的顺序出现,但是当某些内容发生微小变化时,它会被警惕

所以,从技术上讲,它并不是随机的,它可以是一些稳定的顺序。

对于第二个问题,我会说它在插入顺序中几乎肯定

Marc关于处理awakeFromInsert的建议是一个很好的建议,也是你想要的。

答案 2 :(得分:0)

订单可能不是“每次都随机”,但据我所知,你不能/不应该依赖它。如果您需要特定订单,请使用排序描述符。

答案 3 :(得分:0)

订购时无法保证。例如,我可以实现一个NSAtomicStore或NSIncrementalStore,它以随机顺序返回结果,这将是完全正确的。我已经看到SQLite存储在不同版本的操作系统上也会返回不同的顺序。