使用 NSPredicate 搜索 NSDictionaries 的 NSArray 时没有结果

Posted

技术标签:

【中文标题】使用 NSPredicate 搜索 NSDictionaries 的 NSArray 时没有结果【英文标题】:No Result when searching through an NSArray of NSDictionaries using NSPredicate 【发布时间】:2010-11-22 05:05:00 【问题描述】:

嘿, 我有一个 NSDictionaries 数组(例如 [tempArray addObject:[[[NSMutableDictionary alloc] initWithObjects:someArray forKeys:keys] autorelease]]; ),当我尝试使用 NSPredicate 搜索它时,它一直给我“无结果”。 (TempArray 变成 self.patientList)

我没有编译时警告或错误,如果我 NSLog([self.filteredArray count]); 则它也返回 0。

这是我的相关代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(first contains[cd] %@)", self.searchBar.text];
self.filteredArray = [self.patientList filteredArrayUsingPredicate:predicate];
return [self.filteredArray count];

self.patientList 和 self.filteredArray 分别是 NSMutableArray 和 NSArray 类型(将 self.filteredArray 更改为 NSMutableArray 没有帮助)。

我也尝试过使用 == 而不是 contains。使用@"SELF contains[cd] %@" 仅在输入完整项目时返回一个项目(即,如果键“名称”是@“Bob”,那么如果我输入 Bob,它将显示它,但当我输入 Bo 或 ob 时不会显示)。

我真的被这个难住了。

提前致谢!

【问题讨论】:

【参考方案1】:

显然 first 是使用谓词时的保留字。来自 Apple 的文档:

以下词语保留:

AND、OR、IN、NOT、ALL、ANY、SOME、 无,如,CASEINSENSITIVE,CI, 匹配,包含,开始, ENDSWITH、BETWEEN、NULL、NIL、SELF、 真,是,假,否,第一,最后, 大小、任意键、子查询、转换、 真预测,假预测

只需将您的密钥更改为其他名称,也许是名字,它就会起作用。

【讨论】:

非常感谢!只是改变了这一点,它的工作。只是一个问题,如何通过一个键对字典数组进行排序?谢谢 不客气。在对数组进行排序时,有几种方法可用,都以 sortedArray... 开头。如果您不知道怎么做,请在 *** 上提出一个新问题。 @Robert 但是它怎么知道按哪个键排序呢?不过我会四处看看,谢谢。 啊,是的,我记得几年前发现了这个。【参考方案2】:

你可以改用“喜欢”:

first like[c] *%@*

【讨论】:

【参考方案3】:

乍一看,这似乎是正确的。那么:你的字典真的有一个叫做first的键吗?如果他们这样做,它是否完全符合案例?

【讨论】:

如果我在同一个地方做NSLog(@"%@",[[self.patientList objectAtIndex:0] objectForKey:@"first"]); (numberOfRowsInSection:) 那么它会给出'Frederick'。上面的'keys'数组是` NSArray *keys = [[[NSArray alloc] initWithObjects:@"first",@"last",@"address",@"number",nil] autorelease];`

以上是关于使用 NSPredicate 搜索 NSDictionaries 的 NSArray 时没有结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 进行核心数据实体搜索

使用 NSPredicate 搜索/过滤自定义类数组

如何使用 NSPredicate 加快数组搜索速度?

使用 NSPredicate 搜索字符串数组

使用 NSPredicate 搜索 NSFetchedResultsController

如何使用正则表达式搜索忽略 NSPredicate 的某些字符?