繁体   English   中英

NSPredicate 对多关系

[英]NSPredicate to-many relationships

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

我需要使用子查询吗?

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

帮助: :)

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

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

@"ANY subcategories.items > 0"

进入

@"subcategories.items.@count > 0"

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

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

对不起,只有当类别-子类别是一对一的时候,这才有效。

实际上,我认为您应该做的是删除所有没有项目的子类别。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM