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

Posted

技术标签:

【中文标题】默认情况下,核心数据获取(NSFetchRequest)是不是以任何特定方式排序?【英文标题】:Are Core Data fetches (NSFetchRequest) sorted in any specific fashion by default?默认情况下,核心数据获取(NSFetchRequest)是否以任何特定方式排序? 【发布时间】:2009-05-20 13:50:23 【问题描述】:

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

【问题讨论】:

【参考方案1】:

不,不能保证一定会订购。根据您使用的数据存储类型(我从未尝试过),您可能会碰巧看到一致的顺序,但这不是您应该以任何方式依赖的东西。

不过,按创建日期订购很容易。只需向您的实体添加一个日期属性,将其初始化为 awakeFromInsert 中的当前日期,然后在您的 fetch 中指定该排序描述符。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

它以固定的顺序出现,这是某种顺序。请注意,NSSet 只是一个接口,并且有实现 NSSet 的私有类。这意味着,虽然如果您调用 allObjects 来返回某些 NSSet 实例,可能会以某种一致的顺序返回它们,但几乎可以肯定的是,它是哈希排序的,因为集合几乎普遍实现为哈希字典。

由于散列算法的变化很大,具体取决于存储的内容和散列方式,您可能会“幸运”地发现它每次都以相同的顺序出现,但是当某些变化非常轻微时,您可能会措手不及.

因此,从技术上讲,它并不是真正随机的,它可能处于某种稳定的顺序中。

对于第二个问题,我会说几乎可以肯定不是在插入顺序中。

Marc 关于处理 awakeFromInsert 的建议是一个很好的建议,并且您会想要什么。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于默认情况下,核心数据获取(NSFetchRequest)是不是以任何特定方式排序?的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController fetchedObjects 返回 nil

在不获取现有对象的情况下创建核心数据关系

核心数据 - 在不触发错误的情况下获取对多关系的 objectID

NSPredicate 按属性过滤核心数据关系 NSSet

核心数据子上下文不预取关系

iOS:核心数据,与Auto ID的关系数