NSPredicate 通过选择带有 Beginswith 的键来获取 NSDictionary 的值
Posted
技术标签:
【中文标题】NSPredicate 通过选择带有 Beginswith 的键来获取 NSDictionary 的值【英文标题】:NSPredicate get Values of NSDictionary by selecting Keys with Beginswith 【发布时间】:2014-02-13 22:06:25 【问题描述】:我必须管理这个丑陋的 xml 结构。 如何查询所有以/包含“Key”开头的 Key-Tag?
Xml-结构:
<Data>
<Rec>
<Key1>0001</Key1>
<Key2>0015</Key2>
<Key3>0002</Key3>
<Key4>0022</Key4>
...
</Rec>
<Rec>
<Key1>0015</Key1>
<Key2>0022</Key2>
<Key3>0002</Key3>
<Key4>0001</Key4>
...
</Rec>
...
</Data>
Rec-Object-Structure:
@interface Rec : NSObject
@property (nonatomic, copy) NSMutableDictionary *content;
@end
这是我在 Key1 上选择的代码:
predicateRecs = [NSPredicate predicateWithFormat:@"content.%K == %@", @"Key1", @"0001"];
[result addObjectsFromArray:[recs filteredArrayUsingPredicate: predicateRecs]];
recs 是一种 NSArray 类型,包含 Rec - 对象。
%K 需要能够执行以下操作:content.@allKeys BEGINSWITH %@ == %@
,@"Key", @"0001"`
我想获取所有具有值的键,例如0001 我该怎么做?
谢谢
【问题讨论】:
您的“代码”sn-p 中的“**recs**
”位是否正确?
不,它应该只是粗体。我已经修好了。
你试过了吗:predicateRecs = [NSPredicate predicateWithFormat:@"@allValues == %@", @"0001"];
@Lefteris:它对我不起作用。请记住,我想从 NSDictionary 中获取所有项目,其中所有 NSDictionary-Keys 都以“Key”开头并具有例如值“0001”。在这种情况下,结果应该是:[Key1][0001]
和 [Key4][0001]
。我想它需要查询类似的东西,其中 Key 有一种 * Placeholder: [NSPredicate predicateWithFormat:@"content.%K == %@", @"Key*", @"0001"];
【参考方案1】:
然后我会根据您的 cmets 使用子查询:
predicateRecs = [NSPredicate predicateWithFormat:@"SUBQUERY(FUNCTION(SELF, 'allKeys'), $k, SELF[$k] beginswith[cd] %@ AND SELF[$k] == %@).@count > 0", @"Key",@"0001"];
Dave DeLong 是谓词大师: http://www.mactech.com/sites/default/files/Dave_DeLong-Power_Of_Predicates.pdf
当然还有: https://***.com/a/5570510/312312
【讨论】:
谢谢,您的查询看起来不错,但是当我尝试将它实现到我的 Obj 结构时:[NSPredicate predicateWithFormat:@"SUBQUERY(FUNCTION(content, 'allKeys'), $k, content[$k] beginswith[cd] %@).@allValues == %@", @"Key",@"0001"];
我收到异常:NSUnknownKeyException',原因:'[<__nsarraym> valueForUndefinedKey:]: 这个类对于键 allValues 不是键值编码兼容的。' 但是 content 是一个 NSDictionary。我在这里做错了什么?再次感谢
谢谢,现在可以了。 [NSPredicate predicateWithFormat:@"SUBQUERY(content.@allKeys, $k, $k beginswith[cd] %@ AND content[$k] == %@).@count > 0", @"key", @"0001"];
或者如果您愿意,可以使用:[NSPredicate predicateWithFormat:@"SUBQUERY(FUNCTION(content, 'allKeys'), $k, $k beginswith[cd] %@ AND content[$k] == %@).@count > 0", @"key", @"0001"];
以上是关于NSPredicate 通过选择带有 Beginswith 的键来获取 NSDictionary 的值的主要内容,如果未能解决你的问题,请参考以下文章
带有 NSPredicate 的 FetchRequest 不会在新条目上更新
带有数组的 nsdictionary nspredicate 过滤