可能在其他地方回答了这个问题,但我找不到答案。我有一个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)"];

09-10 09:57
查看更多