NSPredicate to many relationship

时间:2012-04-10 11:16:33

标签: ios nspredicate one-to-many relationship

如何查找包含多个项目的子类别的所有类别? 我使用以下代码,但我得到“这里不允许多对多密钥”。

我需要使用SUBQUERY吗?

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

帮助! :)

3 个答案:

答案 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