NSPredicate在获取请求中使用@max和其他条件

时间:2015-05-14 18:36:13

标签: ios core-data nspredicate nsfetchrequest

我有一个CoreData实体Song,它具有日期属性pushDate和布尔属性isPublic

我需要获取最新的公开歌曲。

要获得最新信息,我可以使用 -

request.predicate = [NSPredicate predicateWithFormat:@"pushDate==max(pushDate)"];

但是当我尝试 -

request.predicate = [NSPredicate predicateWithFormat:@"pushDate==max(pushDate) AND isPublic == YES"];

我没有得到任何结果(我100%肯定我有公共歌曲== YES)。

我可以使用这个谓词吗?如果没有原因/什么是正确的方法呢?

由于

3 个答案:

答案 0 :(得分:1)

您可以尝试首先获取所有对象public

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isPublic == YES"];
[request setPredicate:predicate];

使用排序描述符对pushDate进行排序:

NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"pushDate" ascending:NO];
[request setSortDescriptors:@[sortDesc]];

将请求的限制设置为1:

[request setFetchLimit:1];

答案 1 :(得分:0)

我认为问题在于max(pushDate)在所有歌曲中进行评估,而不仅仅是公共歌曲。如果最近的歌曲(即符合第一个子句pushDate == max(pushDate)的歌曲)不公开,则第二个子句(isPublic == YES)将失败。

如果你想要“最新的公共歌曲”,那么在找到最新的歌曲之前,你必须过滤到公共歌曲。

为此,我会使用仅获取公共歌曲的谓词:

request.predicate = [NSPredicate predicateWithFormat:@"isPublic == YES"];

并指定sortDescriptor,按降序pushDate的顺序对结果进行排序:

request.sortDescriptors = [[NSSortDescriptor sortDescriptorWithKey:@"pushDate" ascending:NO]];

结果中的第一项将是您想要的歌曲。要避免获取所有行,请使用:

request.fetchLimit = 1;

在执行提取之前。

答案 2 :(得分:-1)

试试这个......

request.predicate = [NSPredicate predicateWithFormat:@"pushDate==max(pushDate)" AND "isPublic == YES"];

我认为这可能是缺少引号的情况。

除了注意:这是我更喜欢使用复合谓词的原因之一......在我看来,它们更容易阅读。