我有一个CoreData实体Song
,它具有日期属性pushDate
和布尔属性isPublic
。
我需要获取最新的公开歌曲。
要获得最新信息,我可以使用 -
request.predicate = [NSPredicate predicateWithFormat:@"pushDate==max(pushDate)"];
但是当我尝试 -
request.predicate = [NSPredicate predicateWithFormat:@"pushDate==max(pushDate) AND isPublic == YES"];
我没有得到任何结果(我100%肯定我有公共歌曲== YES)。
我可以使用这个谓词吗?如果没有原因/什么是正确的方法呢?
由于
答案 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"];
我认为这可能是缺少引号的情况。
除了注意:这是我更喜欢使用复合谓词的原因之一......在我看来,它们更容易阅读。