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(不支持比较器块)