如何查找包含多个项目的子类别的所有类别? 我使用以下代码,但我得到“这里不允许多对多密钥”。
我需要使用SUBQUERY吗?
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Categories"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];
[request setPredicate:predicate];
帮助! :)
答案 0 :(得分:9)
根据我的经验,您应该在
中更改谓词格式字符串NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];
这
@"ANY subcategories.items > 0"
到
@"subcategories.items.@count > 0"
请注意,ANY关键字也需要使用,否则您将以错误的方式查询属性。
答案 1 :(得分:3)
在您的NSPredicate中,您应该使用subcategories.items.@count >0
。
Sorr,只有在类别子类别为1时才有效。
真的,你应该做的是删除所有没有物品的子类别,我想。
比tou更应该检查是否有任何子类别,这意味着它们不是空的。
subcategories.@count >0
答案 2 :(得分: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聚集体的Keepath,其中不应有一个;失败 处理$ s.items。@ count