【问题标题】:NSSortDescriptor which generates ORDER BY `name` = 'bob' DESC?NSSortDescriptor 生成 ORDER BY `name` = 'bob' DESC?
【发布时间】:2016-03-14 00:57:36
【问题描述】:

在原始 SQL 中,将所有 bob 排在第一位会很简单。

如何使用 NSFetchedResultsController 和 NSSortDescriptor 做到这一点?

【问题讨论】:

  • 你试过什么?这将是一个微不足道的排序描述符,这让我相信你甚至没有尝试过。
  • 这不是一个简单的排序描述符,如果你考虑到,他想先排序“bob”,即使数据库中有“amin”。
  • Avi 这绝对不是一个简单的排序描述符:)

标签: objective-c core-data nsfetchedresultscontroller nssortdescriptor


【解决方案1】:

我认为NSSortDescriptor 无法做到这一点,因为这是用于键值排序的,不支持表达式。

但是,它可以在NSFetchRequest 的帮助下工作。设置获取请求的结果类型为字典

fetchRequest.resultType = NSDictionaryResultType;

然后您可以将要获取的属性设置为您想要的属性,并为计算属性添加表达式:

NSExpression *expression = [NSExpression expressionWithFormat:@"name=='bob'"];
NSExpressionDescription *expressionDescription = [NSExpressionDescription new];
expressionDescription.name = "isCalledBob";
expressionDescription.expression = expression;
expressionDescription.resultType = NSBooleanAttributeType;

[fetchRequest propertiesToFetch:@[…, expressionDescription];

然后你可以在isCalledBob键上使用NSSortDescriptor

有了这个,您可以获得字典而不是托管对象。

在 Safari 中输入,没有测试,我的孩子几分钟后醒来。

【讨论】:

  • NSFetchedResultsController 是必需的,否则我可以使用块比较器或仅在获取后进行数组排序。
  • 是的,你可以这样做。但是为此访问属性会导致所有对象的(属性)故障。在这种情况下,我宁愿进行两次提取,一次用于 bob,一次用于非 bob,然后添加结果数组。 – 如果可能的话。
【解决方案2】:

我发现这个问题的解决方案是添加一个额外的字段来帮助 FRC。即isBob,只要设置名称就会更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 2021-07-14
    • 1970-01-01
    • 2020-03-09
    • 2020-02-19
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多