您只能在 SQL 后端使用一对多关系。这会做到这一点,但您必须将“反向链接”添加到有序集中(如果您使用排序则保留顺序 - 和唯一性,因为您可能会获得多个子类别指向同一类别)。考虑到限制,不理想,但还不错。
// 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 聚合的 Keypath 不应该有;未能处理 $s.items.@count