可能在其他地方回答了这个问题,但我找不到答案。我有一个Speaker
实体,与Speech
对象有很多关系。我该如何编写一个谓词,以获取仅具有Speakers
属性且具有Speech
对象的所有audioURL
?
我已经尝试了一些方法,主要是对以下谓词进行了调整:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Speaker"];
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat:@"speech.audioURL != nil AND speech.audioURL != ''"];
最佳答案
换句话说,您要获取Speakers
,其中其Speech
对象中没有一个具有audioURL
==“”并且其Speech
对象中没有一个具有audioURL
== nil:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Speaker"];
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat:@"(NONE speech.audioURL == nil) AND (NONE speech.audioURL == '')"];
编辑
但是经过测试,CoreData似乎将NONE解释为ANY NOT而不是ALL NOT。因此,请使用SUBQUERY:
predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(speech, $s, $s.audioURL == nil OR $s.audioURL == '').@count == 0"];
这可以处理
Speaker
语音符合条件的情况。如果您还希望排除那些没有讲话的发言人,请添加另一个子句:predicate = [NSPredicate predicateWithFormat:@"(speech.@count > 0) AND (SUBQUERY(speech, $s, $s.audioURL == nil OR $s.audioURL == '').@count == 0)"];