Core Data筛选数据的NSPredicate
Core Data筛选数据的NSPredicate

Core Data筛选数据的NSPredicate

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/

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注