NSSortDescriptor 生成 ORDER BY `name` = 'bob' DESC?

Posted

技术标签:

【中文标题】NSSortDescriptor 生成 ORDER BY `name` = \'bob\' DESC?【英文标题】: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 这绝对不是一个简单的排序描述符:) 【参考方案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,只要设置名称就会更新。

【讨论】:

以上是关于NSSortDescriptor 生成 ORDER BY `name` = 'bob' DESC?的主要内容,如果未能解决你的问题,请参考以下文章

NSSortDescriptor 错误:“[NSSortDescriptor 计数]:无法识别的选择器发送到实例”

具有任意排序的 NSSortDescriptor

不支持的 NSSortDescriptor(不支持比较器块)

使用 NSSortDescriptor 对 NSOrderedSet 进行排序

创建 NSSortDescriptor

NSSortDescriptor 不排序 NSArray