6

如何找到所有具有超过 1 个项目的子类别的类别?我正在使用以下代码,但我得到“这里不允许多对多键”。

我需要使用子查询吗?

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Categories"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];
[request setPredicate:predicate];

帮助!:)

4

3 回答 3

9

根据我的经验,您应该更改谓词格式字符串

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];    

@"ANY subcategories.items > 0"

进入

@"subcategories.items.@count > 0"

请注意,ANY 关键字也需要使用,否则您将以错误的方式查询属性。

于 2012-04-21T08:42:50.190 回答
3

在您的 NSPredicate 中,您应该subcategories.items.@count >0改用。

抱歉,仅当类别子类别是一对一时才有效。

真的,你应该做的是删除所有没有项目的子类别,我想。

Than tou 应该只检查是否有任何子类别,这意味着它们不是空的。 subcategories.@count >0

于 2012-04-12T08:57:24.203 回答
2

您只能在 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

于 2012-04-14T14:58:02.357 回答