我在这个问题上摸不着头脑。我有一个工作,但我不明白,所以这不算数。我想要做的是实体(在这种情况下,“照片”说),我想找到除指定用户以外的任何人审查的所有照片。这里的关系是Photo-> Review-> User,其中照片可以有多个评论,每个评论只由一个用户拥有。前两个例子是我的逻辑第一次尝试,但不起作用。我找到了一些类似的代码来显示子查询是否有效,但有人可以解释为什么前两个例子不起作用吗?
// this does not work
[NSPredicate predicateWithFormat:@"NOT (ANY reviews.user = %@)", self.user]
// this does not work
[NSPredicate predicateWithFormat:@"NONE reviews.user = %@", self.user]
// this works
[NSPredicate predicateWithFormat:@"SUBQUERY(reviews, $x, $x.user == %@).@count == 0", self.user];
答案 0 :(得分:3)
试试这个
NSPredicate *predicate = [NSCompoundPredicate notPredicateWithSubpredicate:[NSPredicate predicateWithFormat:@"ANY reviews.user = %@", self.user]];
答案 1 :(得分:0)
[NSPredicate predicateWithFormat:@"NOT reviews.user = %@", self.user]
答案 2 :(得分:-1)
问题在于您要比较谓词中的关系而不是属性。您的User
应具有唯一属性,例如name
。我建议您通过以下方式在谓词中使用它:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Photo"];
NSPredicate * p = [NSPredicate predicateWithFormat:@"ANY comments.user.name != %@", @"John Smith"];
// NSPredicate * p = [NSPredicate predicateWithFormat:@"NONE comments.user.name == %@", @"John Smith"];
request.predicate = p;
答案 3 :(得分:-1)
我发现通过比较有问题的实体的唯一标识符而不是实体本身来执行核心数据关系比较会更好。例如,在我的应用中,我有一个名为User
的实体,它有一个属性objectId
。 (注意:不要将此与Core Data对象的内部objectID
混淆。objectId
只是我外部数据库的唯一主键。然后,您的谓词将如下所示:< / p>
NSPredicate *predicate = [NSPredicate predicateWithFormat@"ANY reviews.user.objectId != %@", self.user.objectId];