使用Core Data中的NSPredicate关系出现问题的解决方法

18

我对这个问题感到困惑。我有一个解决方法,但是我不理解它,所以不能算数。我的目标是对于某个实体(在这种情况下是“照片”),我想找到任何人审查过但不是指定用户的所有照片。这里的关系是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];

2
你说得对,这对于to-many是行不通的。你的实体模型是如何构建的,以至于reviews.user是一个to-many关系? - ImHuntingWabbits
1
它应该可以工作(第一个和第二个例子)。ImHuntingWabbits可能是正确的方向,你的模型可能出了问题。你能发布一个示例项目吗?还是需要一个作为示例? - Allen Ding
1
我有相同的问题,无法使用 NOT 或 NONE 反转关系,只能使用子查询。 - lkraider
1
我也遇到了完全相同的问题 - 有解决方法吗? - mootymoots
2
@Duane Fields,你最终是如何解决这个问题的?我也遇到了完全相同的问题。这里提出的所有建议都没有起作用,除了子查询。你是如何解决这个问题的?还是你坚持使用子查询? - thephatp
显示剩余4条评论
4个回答

3

尝试一下这个

NSPredicate *predicate = [NSCompoundPredicate notPredicateWithSubpredicate:[NSPredicate predicateWithFormat:@"ANY reviews.user = %@", self.user]];

0
[NSPredicate predicateWithFormat:@"NOT reviews.user = %@", self.user]

NOT ANY - Daij-Djan

-1

我发现通过比较实体本身的关系,与通过比较实体的唯一标识符来执行Core Data关系比较相比,后者更好。例如,在我的应用程序中,我有一个名为User的实体,它具有属性objectId。(注意:这不应与Core Data对象的内部objectID混淆。 objectId只是来自我的外部数据库的唯一主键。然后,您的谓词将如下所示:

NSPredicate *predicate = [NSPredicate predicateWithFormat@"ANY reviews.user.objectId != %@", self.user.objectId];

-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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接