NSPredicate 用于至少有一个具有属性值的相关实体的实体

NSPredicate for entities that have at least one related entity with attribute value

这可能在别处得到解答,但我找不到答案。我有一个 Speaker 实体与 Speech 对象具有一对多关系。我如何编写一个谓词来获取所有只有 Speech 对象和 audioURL 属性的 Speakers

我尝试了一些方法,主要是调整以下谓词:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Speaker"];
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat:@"speech.audioURL != nil  AND  speech.audioURL != ''"];

换句话说,您想要获取 Speakers 其中 NONE 的 Speech 对象具有 audioURL == "" 和 NONE 的 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 的演讲(如果存在)符合条件的情况。如果你也想排除那些没有发言的Speaker,再加一个子句:

predicate = [NSPredicate predicateWithFormat:@"(speech.@count > 0) AND (SUBQUERY(speech, $s, $s.audioURL == nil OR $s.audioURL == '').@count == 0)"];