过滤NSFetchedResultsController的nil值?

时间:2009-07-01 19:35:44

标签: iphone cocoa cocoa-touch core-data

我有NSFetchedResultsControllerNSManagedObjectContext获取对象。

这些对象具有lastOpened属性,该属性最初为nil,仅在查看时设置。

我希望我的UITableView显示最近打开的对象列表,我可以通过向NSSortDescriptor添加NSFetchRequest来执行此操作。

问题:

我不想显示从未研究过的对象。 (lastOpened == nil)我可以通过相同的NSFetchRequest对此进行排序吗?有没有更好的方法来过滤数据?

感谢。

3 个答案:

答案 0 :(得分:8)

绝对。您正在寻找的是NSPredicate。基本上,它允许您指定希望获取的对象满足的一个或多个条件,然后仅提取符合这些条件的对象。

构建谓词是一个稍微棘手的主张,但是 - 您可能需要查看Predicate Format String Syntax指南才能开始使用。 对于你的特定情况,它甚至更棘手,因为我不确定在谓词术语中是否有nil值的表示。但是,你可以通过在遥远的过去使用一些日期来解决这个问题:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastOpened > %@",
                          [NSDate dateWithTimeIntervalSince1970:0]];

您可以直接在谓词中检查nil:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastOpened != nil"];

这将创建一个谓词,该谓词仅允许返回具有设置日期(1970年1月1日之后的任何内容)的对象。然后,在执行之前,将谓词添加到获取请求中:

// Assuming you have some almost-ready NSFetchRequest *request:
[request setPredicate:predicate];

答案 1 :(得分:5)

试试这个:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"lastOpened != nil"];
... // add sort descriptors etc.

然后将获取请求添加到NSFetchResultsController

答案 2 :(得分:0)

对于Swift,您可以使用布尔值初始化NSPredicate以始终返回true,实际上是一个不会过滤任何内容的过滤器

return fetchedResultsController("Terminal", withFilter: NSPredicate(value: true), sortColumns: sortColumns, sortDirections: sortDirections)