0

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

我正在尝试创建一个人员 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

我的谓词有什么问题?

4

2 回答 2

3
[NSPredicate predicateWithFormat:@"ANY persons != %@", fred]

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

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

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

但是,似乎存在一个核心数据错误,即“NOT ANY”或“NONE”在谓词中无法正常工作,将NSPredicate Aggregate Operations 与 NONE进行比较。解决方法是使用 SUBQUERY:

[NSPredicate predicateWithFormat:@"SUBQUERY(persons, $p, $p == %@).@count == 0", fred]
于 2013-10-31T21:04:12.967 回答
0

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

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

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

于 2013-10-31T21:00:17.013 回答