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)"];
这可能在别处得到解答,但我找不到答案。我有一个 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)"];