NSPredicate 多字段搜索

Posted

技术标签:

【中文标题】NSPredicate 多字段搜索【英文标题】:NSPredicate multiple field search 【发布时间】:2011-05-31 22:18:02 【问题描述】:

我正在尝试搜索多个字段。像这样的:

[NSPredicate predicateWithFormat:@"(name title contains[cd] %@) AND (title contains[cd] %@",  self.searchBar.text];

在名称字段或标题字段上进行搜索。

另外,如果有人知道通配符搜索会是什么样子,我也将不胜感激。

我试过了:

 [NSPredicate predicateWithFormat:@"* contains[cd] %@",  self.searchBar.text];

我的错误代码:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "(name contains[cd] %@) OR (title contains[cd] %@"'

【问题讨论】:

【参考方案1】:

首先,您必须指定所有要检查的属性,因为没有固定或通用的属性列表,并且在 Objective-C 中,属性和任何其他方法之间没有真正的语义区别。

其次,要检查多个属性以查看它们是否包含搜索字符串,您应该使用OR,而不是AND,因为如果任何属性匹配,则满足您的搜索,不是全部

否则,您的语法似乎是正确的(我假设第一个子谓词中的 name title 只是 name。)

【讨论】:

我尝试了语法,但它在 OR 和 AND 下都崩溃了。名称和标题是一个错字。感谢您的回复。 对于每个说明符序列(例如%@),您必须提供一个值,即使这些值相同。所以你需要在你的格式字符串之后有两次self.searchBar.text。此外,您需要关闭格式字符串中的第二个括号(即以) 结束它以平衡第二个()。【参考方案2】:

不确定是否还有人阅读这篇文章,但我发现了你的问题。您在第二个谓词中缺少结束“)”。这是正确的代码:

[NSPredicate predicateWithFormat:@"(name title contains[cd] %@) AND (title contains[cd] %@)",  self.searchBar.text];

编辑:在测试之后,我注意到两个格式说明符与一个格式参数一起工作(见上面的代码)。当我添加第三个谓词和格式说明符(只有一个格式参数)时,它崩溃了。无论哪种方式,您都应该始终拥有相同数量的格式说明符和格式参数。

【讨论】:

以上是关于NSPredicate 多字段搜索的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController 中的 NSPredicate 不使用 Category 的 getter

Objective-c NSPredicate - 按不同 NSManagedObjectContext 中的 ObjectId 过滤

NSArray 上的 NSPredicate 用于搜索任何对象

创建一个带有换行符的 NSPredicate 作为字符串的一部分

NSPredicate 和BeginsWith

NSPredicate 搜索 NSSet