NSPredicate 是 Core Data 和其他 Apple 框架中用于描述查询条件的对象。它可以构建过滤条件,在查询中筛选出满足特定条件的记录,类似于 SQL 中的 WHERE 子句。
基本用途
在 Core Data 查询中,NSPredicate 常常用于筛选数据。它可以根据属性的值、范围、日期等各种条件来过滤结果集。可以将它附加到 NSFetchRequest 上,或者在一些其他场景(如 NSPredicate 格式化字符串、集合筛选等)中使用。
常用方法
NSPredicate 提供了一些常见的初始化方式:
1、格式化字符串(格式化条件)
这是最常用的一种方法。可以用类似 SQL 的方式编写条件表达式。
let predicate = NSPredicate(format: "name == %@", "John")
这个例子中,”name == %@”, “John” 就是格式化条件,表示我们要查询 name 等于 “John” 的数据。%@ 是一个占位符,表示条件的参数。
2、谓词逻辑:可以通过 AND、OR 和 NOT 等逻辑运算符来组合多个条件。
let predicate = NSPredicate(format: "age >= %d AND country == %@", 18, "USA")
这个例子表示查询 age 大于等于 18 且 country 为 “USA” 的记录。
3、比较运算符:
==:等于
!=:不等于
<:小于
>:大于
<=:小于等于
>=:大于等于
4、模糊匹配:
% 用于通配符匹配,可以进行类似 SQL 的 LIKE 操作。
let predicate = NSPredicate(format: "name CONTAINS[c] %@", "john")
这表示查找 name 中包含 “john”(不区分大小写) 的记录。
5、日期比较:
可以使用 NSDate 进行日期的比较。
let predicate = NSPredicate(format: "date >= %@", someDate)
6、Null 值比较:
如果要查询某个属性是否为 nil,可以使用 nil 进行比较。
let predicate = NSPredicate(format: "name == nil")
实际应用
在 NSFetchRequest 中应用 NSPredicate 来过滤结果。例如,假设我们有一个 Person 实体,并且想要查询所有年龄大于 18 岁且名字包含 “John” 的人:
let context = persistentContainer.viewContext
let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()
// 创建一个 NSPredicate 过滤条件
let predicate = NSPredicate(format: "age > %d AND name CONTAINS[c] %@", 18, "John")
// 将谓词添加到请求中
fetchRequest.predicate = predicate
do {
let results = try context.fetch(fetchRequest)
print(results) // 打印查询结果
} catch {
print("获取数据失败: \(error)")
}
如果涉及到变量的话,还需要转换为CVarArg,例如:
for (currency, rate) in rates {
let fetchRequest: NSFetchRequest<Eurofxrefhist> = Eurofxrefhist.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "date == %@ AND currencySymbol == %@", date as CVarArg, currency as CVarArg)
}
格式化符号
%@:占位符,代表一个对象值(如字符串、日期等)。
%d:占位符,代表一个整数值。
%f:占位符,代表一个浮动值。
[c]:表示比较不区分大小写(在字符串比较时使用)。
其他操作
除了直接用于 Core Data 的查询,也可以在集合类(如数组)中使用 NSPredicate 来过滤数据。例如,可以在内存中的对象数组上进行过滤:
let array = ["John", "Alice", "Bob", "johnny"]
let predicate = NSPredicate(format: "SELF CONTAINS[c] %@", "john")
let filteredArray = (array as NSArray).filtered(using: predicate)
print(filteredArray) // 输出 ["John", "johnny"]
总结
NSPredicate 是 Core Data 查询中非常强大的工具,它通过使用格式化字符串来定义复杂的查询条件,允许灵活地过滤数据。无论是比较属性值,还是对字符串进行模糊匹配,NSPredicate 都可以有效地筛选数据。
相关文章
Swift CVarArg类型:https://fangjunyu.com/2025/04/10/swift-cvararg%e7%b1%bb%e5%9e%8b/