2

これが重複している場合はお詫びします。20分間の検索では、この正確な状況または解決策は得られませんでした。

XClass、、、の3つのクラスを持つCoreDataスタックがYClassありZClassます。XClassと1対多の関係がありYClassます。YClassと1対多の関係がありZClassます。

のインスタンスを使用して、少なくとも1つに少なくとも1つNSFetchedResultsControllerのインスタンスがあるすべてのインスタンスをフェッチしようとしています。XClassYClassZClass

私の述語は次のように定義されています。

// ...stuff
NSFetchRequest * fetchRequest = [NSFetchRequest new];

NSEntityDescription * entity = [NSEntityDescription entityForName:NSStringFromClass([XClass class])
                                           inManagedObjectContext:managedObjectContext];
fetchRequest.entity = entity;

fetchRequest.predicate = 
[NSPredicate predicateWithFormat:@"0 < SUBQUERY(yObjects, $y, $y.zObjects.@count > 0).@count"];

// ..instantiate NSFetchedResultsController and perform fetch

これにより、次のメッセージで致命的な例外が発生します。Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Keypath containing KVC aggregate where there shouldn't be one; failed to handle $y.zObjects.@count'

YObject他の場所では、述語を使用してインスタンスを正常にフェッチしました[NSPredicate predicateWithFormat:@"zObjects.@count > 0"];

誰かが私が間違っていることを指摘できますか?どうもありがとうございました。

4

1 に答える 1

5

SUBQUERYの述語文字列でコレクション演算子を使用すると、NSPredicateオブジェクトが激しくオブジェクト化されているようです。また、サブクエリ述語のコレクションを操作できないようです。これは、変数が述部のコレクションを表していない場合です。

悪い:SUBQUERY(yObjects, $y, $y.zObjects == NIL) > 0

わかった:SUBQUERY(yObjects, $y, SUBQUERY($y.zObjects, $z, $z == NIL) > 0) > 0

次の式は、SUBQUERYによって返されるフィルター処理されたコレクションにすべての非nilオブジェクトを追加します。つまり、返されるコレクションには、ZClassのインスタンス化を含むXClassのすべてのインスタンスが含まれます。

[NSPredicate predicateWithFormat:@"yObjects.@count > 0 AND (SUBQUERY(yObjects, $y, (SUBQUERY($y.zObjects, $z, $z != NIL).@count > 0)).count > 0)"];
于 2012-06-15T01:19:11.663 に答える