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

Posted

技术标签:

【中文标题】NSPredicate 在获取请求中使用 @max 和其他条件【英文标题】:NSPredicate that uses @max with an other condition in a fetch request 【发布时间】:2015-05-14 18:36:12 【问题描述】:

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

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

要获取最新的,我可以使用 -

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

但是当我尝试时-

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

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

我可以使用这个谓词吗?如果没有,为什么/这样做的正确方法是什么?

谢谢

【问题讨论】:

您是否尝试过在没有max(pushData) 条件的情况下执行isPublic == YES 正如@pbasdf 所指出的,如果最新歌曲未公开,则此谓词将不返回任何结果。除非我读错了,否则为了满足这个谓词,一首歌曲必须具有最大 pushDate(是最新歌曲)并且还将 isPublic 设置为 YES。谓词不查找最新的公开歌曲,仅查找恰好是公开的最新歌曲。请原谅重复,但似乎错过了一个基本点。 【参考方案1】:

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

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

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

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

将请求的限制设置为一个:

[request setFetchLimit:1];

【讨论】:

@shannoga,您能找到解决问题的方法吗?【参考方案2】:

我认为问题在于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;

在执行提取之前。

【讨论】:

【参考方案3】:

试试这个...

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

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

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

【讨论】:

以上是关于NSPredicate 在获取请求中使用 @max 和其他条件的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 获取请求 NSPredicate 不起作用

CoreData请求(Fetch Request)中断言(NSPredicate)使用的一个误区

CoreData请求(Fetch Request)中断言(NSPredicate)使用的一个误区

如果 NSPredicate 失败,啥输出将返回 Fetch 请求

带有谓词的核心数据获取请求。需要正确的 NSPredicate

NSPredicate 中使用的 SUBQUERY( ) 是不是不支持所有集合运算符,如 @max、@min?