基于一对多值的 NSPredicate 过滤器

Posted

技术标签:

【中文标题】基于一对多值的 NSPredicate 过滤器【英文标题】:NSPredicate filter based on one to many values 【发布时间】:2012-04-25 10:12:36 【问题描述】:

我有 2 个具有一对多关系的实体。 Category 代表我的节标题,SubSubCategory 代表我的行。

Category

    name:string
    subs<-->>SubCategory


SubCategory

    name:string
    numbervalue:NSNumber

目前我可以使用NSPredicate 根据名称过滤我的部分。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name==%@",@"anamevalue"];

现在我想进一步过滤此谓词以仅返回具有Subcategorysubvalue == 1 的类别。

如何根据 Category 实体的一对多子项中的值过滤它?

我尝试过类似的方法,但效果不佳。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name==%@ AND subs.numbervalue==%@",@"anamevalue",1];

【问题讨论】:

【参考方案1】:

我会做一个如下的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@ AND ANY subs.numbervalue == %@)", @"anamevalue", [NSNumber numberWithInt:1]];

ANY 是一个谓词修饰符,仅当 subs 集合中至少有一个对象的比较返回 true 时才返回 true。

同样的结果可以通过SUBQUERY来完成。

希望对你有帮助。

【讨论】:

非常感谢。你能分享一个谓词修饰符列表的链接吗?我从未在 nspredicate 编程指南中遇到过这种情况 寻找谓词编程指南。在这里Aggregate Operations section 可以找到一些有用的信息。希望对您有所帮助。【参考方案2】:

谓词中的语法错误。您将整数值作为字符串传递。

你的谓词应该是

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name==%@ AND subs.numbervalue==%i",@"anamevalue",1]

除此之外它看起来是正确的。

【讨论】:

以上是关于基于一对多值的 NSPredicate 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

在一对多关系中使用 NSPredicate 进行过滤

核心数据:NSPredicate 一对多对多关系

CoreData:使用 NSPredicate 过滤一对多对多关系(此处不允许错误对多键)

NSPredicate 过滤关系

基于多值对象过滤javascript对象数组

MacOS:NSPredicate 查找“一对一”关系不为零的位置