QueryKit
QueryKit,一个简单的类型安全的 Core Data 查询语言。
使用方法
QuerySet<Person>(context, "Person")
.orderedBy(.name, ascending: true)
.filter(\.age >= 18)
QuerySet
QuerySet 代表来自您的 Core Data 仓库的对象集合。它可能包含零个、一个或多个过滤器。过滤器根据提供的参数缩小查询结果。
获取所有对象
let queryset = QuerySet<Person>(context, "Person")
使用过滤器获取特定对象
您可以使用 filter
和 exclude
方法来过滤 QuerySet,这两个方法可以接受一个谓词,可以使用 KeyPath 扩展来构建。
filter
和 exclude
方法返回包含过滤条件的新 QuerySet。
queryset.filter(\.name == "Kyle")
queryset.exclude(\.age > 25)
如果您想要构建复杂的查询或不愿使用类型安全的属性,您也可以使用标准的 NSPredicate
。
queryset.filter(NSPredicate(format: "name == '%@'", "Kyle"))
queryset.exclude(NSPredicate(format: "age > 25"))
链式过滤
精炼 QuerySet 的结果仍然是一个 QuerySet,因此可以串联起来。例如:
queryset.filter(\.name == "Kyle")
.exclude(\.age < 25)
每次您精炼一个 QuerySet 时,都会得到一个新的 QuerySet 实例,它与之前的 QuerySet 无关。每个精炼都会创建一个独立的、不同的 QuerySet,可以被存储、使用和重复使用。
QuerySet 是延迟加载的
QuerySet 是延迟加载的,创建 QuerySet 不会涉及查询 Core Data。QueryKit 不会在 QuerySet 被评估之前实际执行查询。
排序
您可以使用接受 KeyPath 的 orderBy
函数按顺序排列 QuerySet 的结果。
queryset.orderBy(\.name, ascending: true)
如果您愿意,也可以传递一个 NSSortDescriptor
。
queryset.orderBy(NSSortDescriptor(key: "name", ascending: true))
切片
使用切片,可以将 QuerySet 的结果限制在指定的范围内。例如,要获取 QuerySet 中的前 5 个项目
queryset[0...5]
注意:QuerySet 是延迟评估的。切片不会评估查询。
获取数据
多个对象
您可以使用 array()
函数将 QuerySet 转换为数组。例如
for person in try! queryset.array() {
println("Hello \(person.name).")
}
第一个对象
let kyle = try? queryset.first()
最后一个对象
let kyle = try? queryset.last()
索引处的对象
let katie = try? queryset.object(3)
计数
let numberOfPeople = try? queryset.count()
删除
此方法立即删除您的查询集中的对象,并返回一个计数或错误(如果操作失败)。
let deleted = try? queryset.delete()
运算符
QueryKit 提供了 KeyPath 扩展,提供了运算符函数,允许您创建谓词。
// Name is equal to Kyle
\Person.name == "Kyle"
// Name is either equal to Kyle or Katie
\.Person.name << ["Kyle", "Katie"]
// Age is equal to 27
\.Person.age == 27
// Age is more than or equal to 25
\Person.age >= 25
// Age is within the range 22 to 30.
\Person.age << (22...30)
以下类型的使用 Attribute 进行动比较
比较 | 意义 |
---|---|
== | x 等于 y |
!= | x 不等于 y |
< | x 小于 y |
<= | x 小于或等于 y |
> | x 大于 y |
>= | x 大于或等于 y |
~= | x 类似于 y |
~= | x 类似于 y |
<< | x 在 y 中,其中 y 是一个数组 |
<< | x 在 y 的范围内,其中 y 是一个范围 |
谓词扩展
QueryKit 提供了用于联合多个谓词的 !
、&&
和 ||
操作符。
// Persons name is Kyle or Katie
\Person.name == "Kyle" || \Person.name == "Katie"
// Persons age is more than 25 and their name is Kyle
\Person.age >= 25 && \Person.name == "Kyle"
// Persons name is not Kyle
!(\Person.name == "Kyle")
安装
CocoaPods 是将 QueryKit 添加到项目的推荐方式,您也可以使用 Carthage。
pod 'QueryKit'
许可证
QueryKit 采用 BSD 许可证发布。请参阅 LICENSE。