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 用于搜索任何对象