我有NSFetchedResultsController
从NSManagedObjectContext
获取对象。
这些对象具有lastOpened
属性,该属性最初为nil
,仅在查看时设置。
我希望我的UITableView
显示最近打开的对象列表,我可以通过向NSSortDescriptor
添加NSFetchRequest
来执行此操作。
问题:
我不想显示从未研究过的对象。 (lastOpened == nil
)我可以通过相同的NSFetchRequest
对此进行排序吗?有没有更好的方法来过滤数据?
感谢。
答案 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)