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 请求