Iphone NSPredicate子查询语法
我有一些不友好的字典数组,这些字典又有数据数组,我试图根据传递谓词的任何内部数组过滤外部数组。我似乎无法创建一个NSPredicate来实现这一点。我从以下几点开始:Iphone NSPredicate子查询语法,iphone,ios,nsarray,nspredicate,Iphone,Ios,Nsarray,Nspredicate,我有一些不友好的字典数组,这些字典又有数据数组,我试图根据传递谓词的任何内部数组过滤外部数组。我似乎无法创建一个NSPredicate来实现这一点。我从以下几点开始: NSPredicate *lookupPredicate = [NSPredicate predicateWithFormat: @"row_values.property_id == %@ AND row_values.property_value == %@", @"47
NSPredicate *lookupPredicate = [NSPredicate predicateWithFormat:
@"row_values.property_id == %@ AND row_values.property_value == %@",
@"47cc67093475061e01000540", @"Male"];
[dataRows filterUsingPredicate:lookupPredicate];
这不返回任何值。我尝试了各种形式的ANY,但似乎找不到任何可以解析的东西。同样,目标是只保留那些内部数组字典内容的谓词为真的外部数组字典。我可以看到我花了一天的时间来琢磨咒语来实现这个目标。。。有什么想法吗
dataRows:
(
{
row = 1;
"row_values" = (
{
"property_id" = 47cc67093475061e01000542;
"property_value" = "Mr.";
},
{
"property_id" = 47cc67093475061e01000540;
"property_value" = Male;
}
);
},
{
row = 2;
"row_values" = (
{
"property_id" = 47cc67093475061e01000542;
"property_value" = "Ms.";
},
...
}
}
老兄,“不友好”是对那个阵型的轻描淡写
好吧,我想我明白了:
NSArray *dataRows = @[
@{ @"row" : @"1",
@"row_values" : @[
@{ @"property_id" : @"47cc67093475061e01000542",
@"property_value" : @"Mr." },
@{ @"property_id" : @"47cc67093475061e01000540",
@"property_value" : @"Male" }
]
},
@{ @"row" : @"2",
@"row_values" : @[
@{ @"property_id" : @"47cc67093475061e01000542",
@"property_value" : @"Ms." },
@{ @"property_id" : @"47cc67093475061e01000540",
@"property_value" : @"Female" }
]
}
];
NSPredicate *p = [NSPredicate predicateWithFormat:@"SUBQUERY(row_values, $rv, $rv.property_id = %@ AND $rv.property_value = %@).@count > 0", @"47cc67093475061e01000540", @"Male"];
NSArray *filtered = [dataRows filteredArrayUsingPredicate:p];
让我们看看这个谓词在做什么
SUBQUERY([stuff]).@count > 0
子查询
返回一个对象数组。我们将在dataRows
数组中的每个NSDictionary
上运行此子查询
,我们希望聚合该字典上的子查询
返回内容的所有字典。因此,我们运行子查询
,然后(因为它返回一个集合),询问其中有多少项(@count
),看看是否大于0。如果是,则顶级字典将位于最终过滤数组中子查询
:
SUBQUERY(row_values, $rv, $rv.property_id = %@ AND $rv.property_value = %@)
每个子查询都有三个参数:键路径、变量和谓词。关键路径是我们要迭代的对象的属性。由于子查询
是在最外层的字典上计算的,因此我们将请求该字典的@“row\u values”
,并返回一个数组。然后,子查询
将迭代行\u值
集合中的项
这个变量就是我们将要调用集合中的每个项。在这种情况下,它将是$rv
(row value的缩写)。在我们的例子中,每个$rv
都将是一个NSDictionary
,因为行的值是一个字典数组
最后,将执行谓词,依次为每个字典替换$rv
。在本例中,我们希望查看字典是否具有特定的属性\u id
和特定的属性\u值。如果这样做,它将聚合到一个新数组中,,这就是从子查询返回的数组
因此,换一种方式来说,子查询
将构建一个包含所有行值的数组,这些行值具有我们要查找的内容的属性id
和属性值
(
{
row = 1;
"row_values" = (
{
"property_id" = 47cc67093475061e01000542;
"property_value" = "Mr.";
},
{
"property_id" = 47cc67093475061e01000540;
"property_value" = Male;
}
);
}
)
苹果的子查询文档分散在几个地方
- 描述子查询的文档/语法的一个地方是:
子查询(集合表达式、变量表达式、谓词)代码>
其中表达式是一个计算结果为集合的谓词表达式,variableExpression是一个用于包含集合中每个单独元素的表达式,predicate是用于确定元素是否属于结果集合的谓词
有关更多详细信息和示例,请参见。实际上,我只是简化了源代码结构,以便使用更简单的谓词。开玩笑。。。非常感谢你,戴夫!!这是完美的工作,它是有道理的。我非常感谢您的帮助,如果您需要关于黑色的RGB值或英语中有多少元音的帮助,请告诉我-这些我可以处理。可能是重复的