NSPredicate with a !=?

瘦欲@ 提交于 2019-12-04 06:25:21

问题


I have Core Data Entities Person and Boundary. They have a many-to-many relationship (each person can have many boundaries, and each boundary can have many persons).

I am trying to create a list of what boundaries Person Fred doesn't have a relationship too.

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

I have 47 boundaries in the database, and Fred can see all 47. So I expect my fetch to return 0:

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

What is wrong with my predicate?


回答1:


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

finds all objects that are related to any person other that Fred. What you want is

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

and this should return all objects that are not related to Fred.

However, there seems to be a Core Data bug that "NOT ANY" or "NONE" do not work correctly in a predicate, compare NSPredicate Aggregate Operations with NONE. The workaround is to use a SUBQUERY:

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



回答2:


you need to ask first in Class Boundary if there is a person called Fred that has boundaries. It should be something like:

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

That will fetch all the boundaries that Fred doesn't have.



来源:https://stackoverflow.com/questions/19716276/nspredicate-with-a

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!