【问题标题】:How to sort the results of an NSFetchedResultsController using the order of an NSOrderedSet如何使用 NSOrderedSet 的顺序对 NSFetchedResultsController 的结果进行排序
【发布时间】:2013-07-29 16:34:50
【问题描述】:

NSOrderedSets 保存表中对象的顺序。如果您访问具有 NSOrderedSet 属性的 NSManagedObject 子类实例,那么它们将按顺序排列。

但是,在创建 NSFetchRequest 时,似乎无法使用 NSSortDescriptor 访问该订单。

从原始 SQLite DB 中可以看出,该订单存储在名为 Z_FOK_<relationship name> 的字段中。数据可用,但似乎无法通过核心数据 API 看到。

有没有人知道如何编写一个 NSSortDescriptor 以与 SQLite DB 一起使用以按 NSOrderedSet 指定的顺序返回结果?


更新

相关问题:NSFetchedResultsController and NSOrderedSet relationships

【问题讨论】:

    标签: iphone ios core-data nsorderedset


    【解决方案1】:

    我刚刚在 swift 中尝试过,它似乎对我有用。

    var sectionsExcludingEmpty: [SurveyAnswerSection] {
        let fetchRequest: NSFetchRequest<SurveyAnswerSection> = NSFetchRequest.init(entityName: "SurveyAnswerSection")
        fetchRequest.predicate = NSPredicate.init(format: "surveyAnswer == %@ AND hidden == FALSE", self)
        fetchRequest.sortDescriptors = [ NSSortDescriptor(key: "surveyAnswer", ascending: true) ]
        if let moc = self.managedObjectContext {
            do {
                let results = try moc.fetch(fetchRequest)
                return results
            } catch {
                fatalError("Could not get sectionsExcludingEmpty: \(error)")
            }
        } else {
            fatalError("Unable to get own managed object context")
        }
    }
    

    当我错过fetchRequest.sortDescriptors = [ NSSortDescriptor(key: "surveyAnswer", ascending: true) ] 下线时,它看似随机排序,但添加了行后,它按预期排序。

    在我的例子中,SurveyAnswerSection 与 SurveyAnswer 是一对多的关系。

    【讨论】:

      【解决方案2】:

      我认为这是不可能的。 “排序”与从一个实体A 到另一个实体B 的一对多关系相关联,它不是目标实体B 的属性。 但是 Core Data 获取请求的排序描述符只能使用实体的(持久)属性。

      【讨论】:

      • 这似乎也是我所看到的......我简直不敢相信在 NSSortDescriptor 中没有对此的特殊支持,以便 NSFetchedResultsControllers 可以利用该命令。否则,开发人员仍然需要添加和手动管理“sortOrder”属性——这有点违背 NSOrderedSet 的目的。
      • @CoreyFloyd:请注意,A1 &lt;--&gt;&gt; BA2 &lt;--&gt;&gt; B 可以有两个有序关系,B 对象的顺序完全不同,因此“获取根据有序关系排序的 B 对象”将无论如何都要模棱两可。
      • NSFetchRequest 必须使用排序描述符创建。但是,如果有某种方法可以在没有排序描述符的情况下创建它(使用类别、子类等...),那么当您执行获取请求时,它可能会默认为 NSOrderedSet 顺序。很可能只是未定义的行为,但可能值得一试。
      • @DylanKirkby:该实体没有可以默认使用的“NSOrderedSet 订单”。排序是两个实体之间关系的一个特征。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2019-12-27
      • 1970-01-01
      相关资源
      最近更新 更多