如何在 CoreData iOS 谓词构建器中多次传递相同的参数?

Posted

技术标签:

【中文标题】如何在 CoreData iOS 谓词构建器中多次传递相同的参数?【英文标题】:How to pass the same parameter multiple times in CoreData iOS predicate builder? 【发布时间】:2017-09-12 07:14:29 【问题描述】:

我有一个 UITableView 和一个 UISearchbar,让我可以根据来自 UISearchbarsearch text 过滤数据。

CoreData 表包含 3 attributes

name, notes, date

我想根据 User 搜索文本在三列中搜索任何匹配项。

所以我试了一下:

let searchText = searchText.lowercased()
let query = "name contains[cd] %@ OR notes contains[cd] %@ OR date contains[cd] %@"
let predicate = NSPredicate(format: query, searchText, searchText, searchText)

有什么方法可以一次性传递同一个参数(searchText)

类似于Java 字符串格式化程序:

let query = "name contains[cd] %1$@ OR notes contains[cd] %1$@ OR date contains[cd] %1$@"
let predicate = NSPredicate(format: query, searchText)

【问题讨论】:

【参考方案1】:

您可以使用替换变量

let searchText = searchText.lowercased()
let template = NSPredicate(format: "name contains[cd] $SRCH OR notes contains[cd] $SRCH OR date contains[cd] $SRCH")
let subVars = ["SRCH": searchText]
let predicate = template.withSubstitutionVariables(subVars)

请参阅Apple Documentation 中的“使用谓词模板创建谓词”。

【讨论】:

sql injection 安全吗? 我想是的。格式字符串的解析主要在模板的初始创建中完成,因此与普通谓词格式字符串进行相同的检查。替换过程会将字符串括在引号中,以防止 sql 注入。

以上是关于如何在 CoreData iOS 谓词构建器中多次传递相同的参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 coredata 中设置日期和时间间隔的谓词

如何通过在 ios 中结合个人实体的名字和姓氏来对全名应用谓词

比较过多关系中的两个属性的 CoreData 谓词

SwiftUI 中的动态过滤器(谓词)

NSPredicate,CoreData 中的空格。如何修剪谓词?

一对多关系的CoreData谓词