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 &gt; 0", @"key", @"0001"]; 或者如果您愿意,可以使用:[NSPredicate predicateWithFormat:@"SUBQUERY(FUNCTION(content, 'allKeys'), $k, $k beginswith[cd] %@ AND content[$k] == %@).@count &gt; 0", @"key", @"0001"];

以上是关于NSPredicate 通过选择带有 Beginswith 的键来获取 NSDictionary 的值的主要内容,如果未能解决你的问题,请参考以下文章

带有 NSPredicate 的 FetchRequest 不会在新条目上更新

带有数组的 nsdictionary nspredicate 过滤

带有核心数据对象的 NSPredicate

带有嵌套数组的 NSPredicate

带有 NSPredicate 的 NSFetchedResultsController 未更新

带有 groupBy 的 nspredicate 不喜欢带有 nsdate 的谓词比较