【问题标题】:Trouble with negating Core Data NSPredicate relationships否定 Core Data NSPredicate 关系的麻烦
【发布时间】:2011-10-15 13:37:33
【问题描述】:

我在这个问题上摸不着头脑。我有一个解决方法,但我不明白,所以这不算数。我想要做的是实体(在这种情况下,可以说是“照片”),我想找到除指定用户之外的任何人评论的所有照片。这里的关系是照片->评论->用户,其中一张照片可以有多个评论,并且每个评论仅由一个用户拥有。前两个例子是我合乎逻辑的第一次尝试,但不起作用。我发现了一些类似的代码,显示了有效的子查询,但是谁能解释为什么前两个示例不起作用?

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

【问题讨论】:

  • 你是对的,这对多对多不起作用,你的实体模型是如何构建的,使得reviews.user 是一对多的关系?
  • 它应该可以工作(第一个和第二个例子)。 ImHuntingWabbits 可能是在正确的轨道上,你的模型可能搞砸了。您可以发布一个示例项目还是需要一个作为示例?
  • 我有同样的问题,不能否定与 NOT 或 NONE 的关系,只能使用子查询。
  • 我也有同样的问题 - 有什么解决办法吗??
  • @Duane Fields,你是怎么解决这个问题的?我有完全一样的问题。除了子查询之外,这里的建议都不起作用。你是怎么解决这个问题的?还是您坚持使用子查询?

标签: ios core-data nspredicate


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:
    [NSPredicate predicateWithFormat:@"NOT reviews.user = %@", self.user]
    

    【讨论】:

    • NOT ANY 或 NOT ALL 取决于需要
    【解决方案3】:

    问题是您想比较谓词中的关系而不是属性。您的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;
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多