SQL バックエンドでは 1 対多の関係のみを使用できます。これで解決しますが、「バックリンク」を順序付きセットに追加する必要があります(並べ替えを使用する場合に順序を維持するため、および同じカテゴリを指す複数のサブカテゴリを取得する可能性があるため、一意性を維持するため)。制限を考えると、理想的ではありませんが、悪くはありません。
// Search for all subcategories with item count > 0
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Subcategory"];
request.predicate = [NSPredicate predicateWithFormat:@"items.@count > 0"];
NSError *error = nil;
// They should have an inverse relationship to their category...
// We have to iterate and insert them in to a set, but there is no additional
// disk access.
NSMutableOrderedSet *results = [NSMutableOrderedSet orderedSet];
[[self.projectDatabase.managedObjectContext executeFetchRequest:request error:&error] enumerateObjectsUsingBlock:^(Subcategory *obj, NSUInteger idx, BOOL *stop) {
[results addObject:obj.category];
}];
編集
残念ながら、これは SQL ストアでは不可能だと思います。最初に強調しておきますが、私は SQL の専門家に近いわけではなく、通常、これらの種類のクエリが不要になるように CoreData ストアを設計しようとしています。ただし、次の SUBQUERY は InMemory ストアで動作するため、ある程度適切にフォーマットされたサブクエリです。
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(subcategories, $s, $s.items.@count > 0).@count > 0"];
ただし、その述語は、SQL ストアを使用するとエラーになります。ドキュメントには、SQL ストアで述語を使用する場合にかなりの数の制限があると書かれているため、私は驚かないし、これを調査するのに多くの時間を費やす傾向もありません。
KVC 集合体が含まれていてはならない場所にあるキーパス。$s.items.@count の処理に失敗しました