【问题标题】:NSFetchRequest without sort descriptors没有排序描述符的 NSFetchRequest
【发布时间】:2011-03-24 18:48:30
【问题描述】:

如果不提供 NSSortDescriptor,我们将无法使用 NSFetchRequest。我要做的就是获取结果并按照它们的创建顺序显示它们。有没有内置的方法可以做到这一点?还是我必须创建一个新的“自动增量”字段? (在我看来,这与 CoreData 所代表的一切背道而驰)。

【问题讨论】:

    标签: iphone core-data nsfetchrequest nssortdescriptor


    【解决方案1】:

    Core Data 不对订单做出任何保证。您不必创建“自动增量”字段;但是,您可以制作适当的属性。由于您显然关心某物的创建日期,因此您应该向数据对象添加一个 dateCreated 属性。然后,按那个排序。

    您可以在托管对象的didAwakeFromInsert 方法中轻松设置。

    【讨论】:

    • 谢谢,我想这是我唯一的选择。
    • 对此有一点更新:从 iOS5 开始,可以建立有序关系。然而,NSFetchedResultsController 仍然要求 NSFetchRequest 指定一个排序描述符,即使该字段被声明为已排序。我还没有找到解决办法。
    【解决方案2】:

    听起来您正在考虑表格方面的 Core Data,并期望应该有一个自动排序,就像表格提供的行号一样。但是,Core Data 不使用表、行或任何其他固定的线性数据结构。

    没有内置的提取顺序,因为每个提取请求都高度特定于它帮助填充的视图的需求。 NSFetchRequest 需要排序描述符,因为它返回一个数组,并且需要排序描述符才能将对象图中的无序托管对象转换为有序数组。

    对象图中的托管对象通常没有内置顺序,因为每个数据模型都有不同的数据结构标准。例如,对于大多数模型,插入对象的时间序列是不相关的。为什么在只有极少数情况下才需要时,为什么要在每个 Core Data 应用程序必须使用的每个托管对象中构建时间戳?

    如果时间序列是模型逻辑关系的重要组成部分,即它反映了数据模型模拟的真实对象、事件或条件,那么as Jason Coco suggested,您应该向实体本身添加时间戳属性,以便实体对象将模拟它们自己创建的时间。

    【讨论】:

    • 感谢您的宝贵意见。实际上,我并没有从表格的角度考虑 Core Data,因为它是基于集合的。但由于它确实在内部存储托管对象 ID,我希望避免添加任何新属性。我想我别无选择。
    • 我认为您不了解 Core Data 的实用性。获取请求返回数组,因此 Core Data 在关系中使用的集合不会导致表出现问题。 NSFetchedResultsController 是专门为使 UITableViews 使用 Core Data 变得容易而创建的。 Apple 打算让 Core Data 成为所有 Apple 平台应用程序的主要数据模型管理系统。因此,Core Data 是除了最简单的数据结构之外的所有数据结构中最快、最干净的解决方案。它有一点学习曲线,但如果要为 Apple 平台编写应用程序,那么值得花时间。
    • 请忽略我最后的评论。那是为另一篇文章准备的。
    • 我担心你没有完全得到核心数据,这会导致你在路上遇到问题。人们对非对象数据库了解得越多,他们就越难使用面向对象的数据库。为什么你甚至会怀疑 Core Data 有一个内置的时间戳或任何其他排序?创建日期订购与任何其他订购有什么区别?我的意思是,如果不添加字符串属性就不能按字母顺序排序,那么为什么要在没有数据属性的情况下按时订购呢? ObjectID 与排序无关。按照设计,它们包含无法排序的随机元素。
    【解决方案3】:
    [[NSSortDescriptor alloc] initWithKey:@"" ascending:NO];
    

    在我的项目中,我使用 NSFetchRequest 来获取一个列表,并且列表中的所有对象都有一个具有相同值的属性。所以我们使用该属性的名称 "initWithKey:" 。效果很好。

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多