按关系属性对 NSFetchedResultsController 排序? NSFetchRequest NSSortDescriptor

Posted

技术标签:

【中文标题】按关系属性对 NSFetchedResultsController 排序? NSFetchRequest NSSortDescriptor【英文标题】:Sort NSFetchedResultsController By Relationship Property? NSFetchRequest NSSortDescriptor 【发布时间】:2015-05-13 14:06:02 【问题描述】:

如下图所示,Company 对象与一组FinancialMetric 对象有关系。我想通过关系属性financialMetrics 中的特定FinancialMetrics value 与最近的datetype“收入”)之一的值对Company 对象中的NSFetchedResultsController 进行排序.如果不将 Company 对象加载到数组中然后对数组进行排序,这是否可行?我想将所有内容都保留在 NSFetchedResultsController 中,就像您按照 namecity 等任何常规属性进行排序一样。

公司实体详情...

FinancialMetric 实体详细信息...

【问题讨论】:

Company-FinancialMetrics 关系是一对一、一对多还是多对多?您是否需要将结果分组? 公司与 FinancialMetrics 的关系是一对多的。结果不会被分组。只是按收入值降序排列。 这会很困难,因为是一对多的关系,而且需要选择日期最近的值。我认为在Company 中维护一个额外的mostRecentValue 属性可能更容易。 这就是我所害怕的。我希望避免添加仅用于排序的属性。 我认为可能有一种方法涉及首先获取一组 FinancialMetrics(每家公司的最新数据)。然后将该数组作为 IN 谓词传递给 FRC。 FRC 还将获取 FinancialMetrics,因此可以对它们的价值进行排序,但由于这是一对一的关系,因此可以直接与公司联系。缺点是如果 FinancialMetric 对象发生变化,您将不得不重新执行两次提取。 【参考方案1】:

您不能按对多关系的值进行排序。排序描述符不能同时过滤。

您的要求的另一个潜在问题是,您必须进行额外的会计处理以确保例如同一家公司不会重复相同的指标类型。

有几种方法。一种是您在公司实体中保留一个当前值,您可以在指标更改时自动更新该值。如果你只有少数这样的案例,这是一个可行的策略。

另一种方法是在Metric 实体中明确显示您感兴趣的类型。假设您有 12 个不同的指标 - 只需命名它们并将它们作为属性添加到 Metric 实体是可行的。然后,您可以通过一对一关系按特定指标排序,例如metric.revenue

最后,如果你真的想保留抽象,你可以重构你的获取结果控制器,让它获取Metric实体而不是Company。您只需按type 过滤,按value 排序,然后用metric.company.name 而不是company.name 填充表格视图单元格。

【讨论】:

以上是关于按关系属性对 NSFetchedResultsController 排序? NSFetchRequest NSSortDescriptor的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Lighthouse - 按关系的属性对查询进行排序

按 2 级深的键值关系对 NSArray 进行排序

prisma 按关系排序只有 _count 属性。不能按关系字段排序

使用关系对 NSMutableArray 进行排序

核心数据:按关系属性排序

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