0

Core Data Entity Person と Boundary があります。それらには多対多の関係があります (各人は多くの境界を持つことができ、各境界は多くの人を持つことができます)。

私は、フレッドが関係を持っていない境界のリストを作成しようとしています.

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 個すべてを見ることができます。したがって、フェッチが 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」が正しく機能しない Core Data バグがあるようです。NSPredicate Aggregate Operations と NONE を比較してください。回避策は、SUBQUERY を使用することです。

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

Class Boundaryフレッドという境界線を持つ人がいるかどうかを最初に尋ねる必要があります。次のようになります。

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

これにより、Fred が持っていないすべての境界が取得されます。

于 2013-10-31T21:00:17.013 に答える