用谓词对NSFetchRequest进行排序

问题描述:

我有一个SQLite支持的核心数据存储并希望使用NSFetchRequest获取管理对象列表。我希望所说的列表按照可以在数据库级别轻松计算的布尔值进行排序。我知道这是因为它能够用于配制使用NSPredicate相同的条件下,这将如下所示:用谓词对NSFetchRequest进行排序

[NSPredicate predicateWithFormat:@"uid = %@", currentUID] 

可悲的是,似乎没有办法制定使用NSSortDescriptor这样的条件。我如何最好地解决这个问题?难道我取两个列表,一个与

[NSPredicate predicateWithFormat:@"uid = %@", currentUID] 

和一个与

[NSPredicate predicateWithFormat:@"uid != %@", currentUID] 

,后来将它们结合起来?那么我可以优雅地使用NSFetchedResultsController吗?
或者我应该获取所有项目并稍后在代码中进行排序?或者有什么我错过了。

你要求的是没有意义的。

谓词用于选择哪些对象应在一组结果中返回。这是通过评估针对每个对象的谓词来确定谓词是否计算为YESNO(二进制值或2个可能值之一)。如果评估结果为YES,则包含该对象。如果评估结果为NO,则排除该对象。没有回旋的余地。

相比之下,排序描述符评估为less than,equalgreater than。换句话说,它是一个三元数的值(它可以是其中的一个东西)。没有办法用谓词表达三元值(因为谓词是二元的),所以使用谓词作为排序描述符是绝对没有意义的。该API不允许它,因为逻辑不允许它。

所以真正的问题是:你想要做什么?你为什么认为在你的排序描述符中需要一个谓词?

+1

好吧,我明白你来自哪里,看到我的描述有点混乱。我不想使用谓词对结果进行排序,我只是提到了它们,因为它们提供了计算我想要对结果进行排序的值的功能。换句话说,我的谓词匹配的所有结果应该在谓词不匹配的结果之前出现;由单个对象的谓词返回的布尔应该被排序描述符用来将它与另一个对象进行比较(从而产生你的三元结果)。我希望这使事情更清楚。 – 2011-02-18 00:13:39

只需创建一个数组(即使它只包含一个元素)NSSortDescriptors以根据需要对结果进行排序。

您可以使用setSortDescriptors:来设置它们。

fetch可以同时处理谓词和排序。

+0

这不是我不知道如何设置多个`NSSortDescriptor`s。相反,我的问题是,简而言之:我如何配置我的`NSSortDescriptor`来按表达式而不是静态字段名进行排序? – 2013-03-09 12:00:14