私の CoreData 構造は次のようになります。
A.setWithBs ->> B
B.setWithCs ->> C
今、A だけを知っているので、特定の C にリンクする setWithBs で唯一の B をフェッチする必要があります。これは単一のフェッチでエレガントに行うことができますか?
ありがとう
私の CoreData 構造は次のようになります。
A.setWithBs ->> B
B.setWithCs ->> C
今、A だけを知っているので、特定の C にリンクする setWithBs で唯一の B をフェッチする必要があります。これは単一のフェッチでエレガントに行うことができますか?
ありがとう
「self in」と「Subquery」リクエストで試すことができます。この特別なケースをテストしていませんが、これはあなたが行かなければならない方法です
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"B" inManagedObjectContext:context]];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self in %@ AND SUBQUERY(setWithCs, $sc, $sc == %@).@count > 0", A.setWithBs, C];
逆の関係も定義していると仮定します(そうすべきです)
B.inA --> A, C.inB --> B
その後、次のフェッチ リクエストを実行できます。
A *theAObject = ...;
C *theCObject = ...;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"B"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(inA = %@) AND (ANY setWithCs = %@)",
theAObject, theCObject];
[request setPredicate:predicate];
これは、指定された「A」オブジェクトに関連し (逆関係「inA」を介して)、指定された「C」オブジェクトにも関連している (対多関係「setWithCs」を介して) すべての「B」オブジェクトをフェッチします。