【问题标题】:NSPredicate with a !=?带有 !=? 的 NSPredicate
【发布时间】:2013-11-12 00:50:15
【问题描述】:

我有核心数据实体人员和边界。它们是多对多的关系(每个人可以有很多边界,每个边界可以有很多人)。

我正在尝试创建一个人员 Fred 也没有关系的边界列表。

Person *person = [Person MR_findFirstByAttribute:@"name" withValue:@"Fred"];
DLog(@"person.boundaries.count: %d", person.boundaries.count);

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY persons != %@", person];

DLog(@"testBoundaries.count: %d", [Boundary MR_countOfEntitiesWithPredicate:predicate]);

我在数据库中有 47 个边界,Fred 可以看到全部 47 个。所以我希望我的 fetch 返回 0:

DEBUG | -[LoginViewController viewDidLoad] | person.boundaries.count: 47
DEBUG | -[LoginViewController viewDidLoad] | testBoundaries.count: 47

我的谓词有什么问题?

【问题讨论】:

    标签: ios objective-c core-data nspredicate


    【解决方案1】:
    [NSPredicate predicateWithFormat:@"ANY persons != %@", fred]
    

    查找与 Fred 以外的任何人相关的所有对象。你想要的是

    [NSPredicate predicateWithFormat:@"NOT(ANY persons = %@)", fred]
    

    应该返回所有与 Fred 无关的对象。

    然而,似乎有一个核心数据错误,“NOT ANY”或“NONE”不能正常工作 在谓词中, 比较NSPredicate Aggregate Operations with NONE。解决方法是使用 SUBQUERY:

    [NSPredicate predicateWithFormat:@"SUBQUERY(persons, $p, $p == %@).@count == 0", fred]
    

    【讨论】:

    • 其实我还没有测试iOS 7中是否修复了Bug,所以“NOT ANY”可能值得一试......
    • 做到了!子查询有效。再次感谢马丁!伙计,我希望我能在你帮助我的所有时间里给你买啤酒。
    • 没有。 NOT ANY 会出于某种奇怪的原因返回 46 个边界。
    • 当使用 fred + 另一个人时,这不起作用。所以 fred + sally 返回所有不包括 fred 或 sally 的记录以及任何只包括 fred + sally 的记录。 @MartinR
    • @MartinR 正如我们在此讨论的 stackoverflow.com/a/47001325/1951992 更改为 'in' 在这种情况下可以解决问题。 [NSPredicate predicateWithFormat:@"SUBQUERY(persons, $p, $p in %@).@count == 0", [fred, sally]]
    【解决方案2】:

    您需要先在Class Boundary 中询问是否有一个叫 Fred 的人有界限。它应该是这样的:

    NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Boundary"];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ANY persons.name != %@", person.name];
    

    这将获取 Fred 没有的所有边界。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      相关资源
      最近更新 更多