过滤NSFetchedResultsController的nil值?

Mic*_*ich 2 iphone cocoa cocoa-touch core-data

我有一个NSFetchedResultsController从a获取对象NSManagedObjectContext.

这些对象具有一个lastOpened属性,该属性最初nil只在查看时设置.

我希望我UITableView显示最近打开的对象列表,我可以通过添加一个NSSortDescriptor来完成NSFetchRequest.

题:

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

谢谢.

Tim*_*Tim 8

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

然而,构建谓词是一个稍微棘手的命题 - 您可能需要查看谓词格式字符串语法指南才能开始.对于你的特殊情况,它甚至更棘手,因为我不确定在谓词术语中是否有nil值的表示.但是,你可以通过在遥远的过去使用一些日期来解决这个问题:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastOpened > %@",
                          [NSDate dateWithTimeIntervalSince1970:0]];
Run Code Online (Sandbox Code Playgroud)

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastOpened != nil"];
Run Code Online (Sandbox Code Playgroud)

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

// Assuming you have some almost-ready NSFetchRequest *request:
[request setPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)


die*_*ikh 5

试试这个:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"lastOpened != nil"];
... // add sort descriptors etc.
Run Code Online (Sandbox Code Playgroud)

然后将获取请求添加到NSFetchResultsController.