iOS 基于 Cotains 的谓词搜索仅在找到完全匹配时返回

Posted

技术标签:

【中文标题】iOS 基于 Cotains 的谓词搜索仅在找到完全匹配时返回【英文标题】:iOS Cotains-based Predicate search only returns when exact match found 【发布时间】:2011-11-26 13:20:41 【问题描述】:

我正在向我的 ios 应用程序的表格视图组件添加一个搜索栏,该组件允许通过由字典组成的 NSArray 进行搜索。但是,搜索栏并非一直有效 - 如果我的数据完全匹配,但不是部分匹配,它会成功打印出结果。例如,如果输入了确切的短语,它将打印出“关闭灯”作为结果,但如果只输入“转动”则不会。然而,在仅由字符串组成的调试数组上,搜索功能完全符合预期。

我的谓词代码在这里:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope


NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];

self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];


实际工作的测试块是这样写的:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope


NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];

NSArray *array = [NSArray arrayWithObjects:@"Miguel", @"Ben", @"Adam", @"Melissa", nil];

NSArray *moreStuff = [array filteredArrayUsingPredicate:resultPredicate];

NSLog(@"%@", moreStuff);

self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];


在上面的代码块中,NSArray "moreStuff" 打印出来并正确更新,但是在第一个块中,NSArray "searchResults" 仅在输入完全匹配时才返回结果。我在这里完全不知所措,因此非常感谢任何帮助/建议。

【问题讨论】:

【参考方案1】:

因为您要在对象中搜索字符串,所以我认为您只需要更深入地挖掘谓词即可。对象中的字符串只是该对象的部分匹配。当您在谓词中使用 SELF 时,您指定在对象本身内搜索,在您的情况下是一个 NSDictionary。 NSDictionary 中的字符串字段本质上是对象中的对象。因此,如果您正在字典中查找名为“名称”的字段,而不是在 SELF 中查找谓词,它应该在 SELF.Name 中查找。您可以尝试以下代码来搜索 NSDictionary 的 Name 字段。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope


NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.Name CONTAINS[cd] %@", searchText];

self.searchResults = [allSearchableItems filteredArrayUsingPredicate:resultPredicate];


如果您仍需要检查对象中包含的其他字段,您可以创建复合谓词。关于 Predicates 的详细信息可以在Apple's Predicate Programming Guide.找到。

我希望这会有所帮助!

【讨论】:

以上是关于iOS 基于 Cotains 的谓词搜索仅在找到完全匹配时返回的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS 客户端谓词问题查询 Azure 同步表?

ios 谓词的使用

iOS 简单数组谓词

改进 sql 中的文本搜索

Hazelcast 谓词/ SQL 查询类未找到

核心数据:基于谓词的验证