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

时间:2016-01-09 01:49:24

标签: ios core-data nspredicate

这可以在其他地方回答,但我无法找到答案。我有一个Speaker实体与Speech个对象有很多关系。如何编写一个谓词,该谓词将获取只有Speakers属性Speech个对象的所有audioURL

我尝试了一些事情,基本上调整了以下谓词:

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

1 个答案:

答案 0 :(得分:1)

换句话说,您想要提取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解释为AN 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)"];