昨日、もっと単純な例から始めるべきだった質問をしました。質問を基本に絞り込んだので、既存の SO の質問と回答を使用して問題を解決できました。
これを十分に明確に説明する投稿がないと思うので、ここで質問を要約しています(そして私自身の解決策を提供しています)。Core Data を初めて使用し、SQL の概念から抜け出すのに苦労しているので、私のソリューションがどれほど適切であるか、また問題をモデル化するためのより良い方法があるかどうかについてのフィードバックを歓迎します。
質問
次のオブジェクト モデルには、3 つのエンティティ A、B、および C があり、それぞれが対多リレーションシップによってリンクされています。
特定の属性を持つ孫Cエンティティを持つ親Aエンティティを特定するにはどうすればよいでしょうか? 例として、これらのサンプル エンティティとその関係を使用します。
どのエンティティAが Tag:Yes を持つ子エンティティCを持っているかを調べるにはどうすればよいですか?
解決
SUBQUERY
のキーワードを使用してこれを達成できましたNSPredicate
。これが私のために働いたコードスニペットです(管理対象オブジェクトのコンテキストなどを設定していると仮定します):
NSError *error = nil;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityA" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"(0 != SUBQUERY(child, $a, (0 != SUBQUERY($a.child, $child, $child.tag == %@).@count)).@count)", @"YES"];
[fetchRequest setPredicate:predicateTemplate];
NSArray *test = [context executeFetchRequest:fetchRequest error:&error];
すべての重要な NSPredicate 文字列をいくつかの行に分割します。
(0 != SUBQUERY(child,
$a,
(0 != SUBQUERY($a.child,
$child,
$child.tag == %@).@count)
).@count
)
重要な部分は、EntityA
作業する を選択してから、ネストされたサブクエリでchild
エンティティの関係を処理することです。これをいくつかの深さで繰り返すことができると思います。まとめるのに最も直感的なものではありません...しかし、うまくいきます。コメント歓迎。