√ 这个数据库框架灵活到难以控制,本书带你避开衔接,驾驭强大!
√ 全程实践|工作原理|性能提升|融入 Swift ,你需要知道的这里都有!
√ objc 是全球知名 iOS 教学网站,其精品图书更是惠及无数开发者!
√ Swifter 一书作者喵神王巍组织翻译objc系列精品图书将相继问世!
本书向读者介绍使用Core Data时需要特别注意的事项,这将帮助读者避开使用Core Data这个十分灵活且异常强大的框架时的一些陷阱。我们从一个简单的应用例子开始,逐步将其扩展为包含关系、高级数据类型、并发、同步以及其他很多特性的完整例子,并在这个过程中对所有这些主题进行讲解。在本书后半部分,我们还会超出这个基本应用所需要涉及的范围,将知识点深入扩展到Core Data幕后的工作原理上。我们会学习如何获取高性能、不同Core Data设置之间的权衡,以及如何对Core Data代码进行调试和性能测试。本书所有的代码都使用Swift编写,我们也展示了如何将Swift的语言特性融入Core Data中,并写出优雅和安全的代码。我们希望读者在阅读本书的时候有一定的Swift和iOS开发基础,不过相信不论是新人还是富有经验的开发者,都能从本书中找到实用的信息和设计模式。
译者序
在20 世纪60 年代,导航式数据库的概念随着磁盘直接存取而发展起来;从70 年代开始,关系型数据库登上历史舞台,它的概念一直延续至今。我们无法想象现代的计算机程序中离开了数据库会是怎样的景象,数据库技术已经成了这个世界方方面面的基石。
在数据管理和数据库相关的方面,Apple 给出的选择是Core Data。正如在简介中所提到的那样,Core Data 其实并不是一个传统意义上的数据库,而是一套对象图管理系统。这套系统默认使用SQLite 作为底层存储,通过由低向高地将相关的管理组件构建为一个栈,来提供缓存和对象管理机制。这让我们对于数据对象的存储和访问都能够高效而有序地进行。从这一点上来说,Core Data 与单纯的数据库相比,实在是强大得多。
但是能力越大,责任也越大。如果使用不当,那么Core Data 不但不能为你提供良好的数据存储和访问的性能,甚至会连最基本的操作都难以保证。在这种情况下,Core Data 将不再是你开发的助力,反而会成为掣肘。不幸的是,Core Data 本身学习曲线比较陡峭,而涉及的概念又非常多,所以真正想要精通Core Data 并完全发挥它的效能并不是很容易的事情。Apple 在iOS 的很多原生应用中大量使用了Core Data,比如照片、音乐和iBooks 等,并且事实证明它们都出色地完成了任务。在国外,也有很多开发者使用Core Data 作为应用程序的数据层和持久化的选择。相比其他第三方的解决方案,Core Data 不需要引入额外的框架,也相对稳定可靠。但是在国内,现在使用这项技术的开发者较少,大家对Core Data 的研究也普遍没有国外深入,这导致了提到Core Data 很多人会不自觉地抗拒和躲避。将Core Data的使用方法和最佳实践以更容易理解的方式带给国内开发者,促进大家接触Core Data 的架构和思想,这正是我们选择翻译本书的目的。
本书的结构和阅读方法在前言中会有所说明,这里就不再赘述了。需要补充的是,本书里提供了大量的例子和相应的代码,它们大多是需要进行权衡的选择,并对应了不同的场景。只有在你充分理解这些例子的含义后,你才可能在实际使用时做出正确的判断。另外,CoreData 的灵活性是一把双刃剑,当你选择了更多的上下文以及协调器时,也意味着你为项目引入了更多的复杂度。尽可能在能够满足需求的前提下,选择最简单的Core Data 栈设置,是高效、正确使用Core Data 的关键。
本书原著的两位作者有着多年的Core Data 使用经验。Florian Kugler1 是objc.io 的联合创始人,曾经为objc.io 撰写了很多Core Data 相关的文章,深受读者喜爱。Daniel Eggert2 曾供职于Apple,帮助Apple 将照片应用迁移到Core Data 框架内。他们的努力让Core Data 这个看起来有些“可怕”的框架变得平易近人,借此我们可以一窥Core Data 的究竟。不过不论是原作者还是译者,其实和各位读者一样,都只不过是普通开发者中的一员,所以本书出现谬漏可能在所难免。如果你在阅读时发现了问题,可以通过出版社联系我们,我们将及时研究并加以改进。
最后,祝你阅读愉快。
徐 涛
钱世家
王 巍
I Core Data基础 1
第1章 初探Core Data 2
1.1 Core Data架构 2
1.2 数据建模 4
实体和属性 5
托管对象子类 6
1.3 设置Core Data栈 7
1.4 显示数据 9
获取请求 11
Fetched Results Controller 13
1.5 操作数据 19
插入对象 19
删除对象 22
1.6 总结 26
重点 26
第2章 关系 27
2.1 添加Country和Continent实体 27
子实体 31
2.2 创建关系 33
其他类型的关系 35
建立关系 36
关系和删除 41
2.3 适配用户界面 43
2.4 总结 48
重点 48
第3章 数据类型 49
3.1 标准数据类型 49
数值类型 49
日期 50
二进制数据 50
字符串 51
3.2 原始属性和临时属性 51
原始属性 51
临时属性 52
3.3 自定义数据类型 52
自定义值转换器 52
自定义存取方法 56
3.4 默认值和可选值 59
3.5 总结 60
重点 60
II 理解Core Data 61
第4章 访问数据 62
4.1 获取请求 62
对象惰值 64
获取请求的结果类型 67
批量获取 69
异步获取请求 70
4.2 关系 70
4.3 其他取回托管对象的方法 71
4.4 内存考量 72
托管对象及其上下文 72
关系的循环引用 73
4.5 总结 74
重点 74
第5章 更改和保存数据 76
5.1 变更追踪 76
5.2 保存更改 78
验证 80
保存冲突 82
5.3 批量更新 82
5.4 总结 84
重点 84
第6章 性能 86
6.1 Core Data栈的性能特质 86
详解性能 87
6.2 避免获取请求 89
关系 89
搜索特定的对象 91
类似单例的对象 93
小数据集 96
6.3 优化获取请求 96
对象排序 96
避免多个、连续的惰值 97
批量获取 98
Fetched Results Controller 99
关系预加载 99
索引 100
6.4 插入和修改对象 102
6.5 如何构建高效的数据模型 103
6.6 字符串和文本 106
6.7 独家秘诀的可调参数 106
6.8 总结 107
III 并行和同步 109
第7章 与网络服务同步 110
7.1 组织和设置 110
项目结构 111
7.2 同步架构 112
7.3 上下文属主 113
线程、队列和上下文 113
7.4 响应本地更改 115
7.5 响应远程更改 119
7.6 更改处理器 119
上传Moods 120
7.7 删除本地对象 123
7.8 分组和保存更改 123
7.9 扩展同步架构 125
跟踪每个属性的更改 125
链接更改处理器 125
自定义网络代码 126
第8章 使用多个上下文 128
8.1 Core Data和并发 128
在不同的上下文之间传递对象 130
合并更改 132
8.2 Core Data栈 134
两个上下文,一个协调器 134
两个协调器 136
嵌套上下文的设置 137
8.3 总结 144
重点 145
第9章 使用多个上下文的问题 146
9.1 保存冲突 146
预定义的合并策略 147
自定义合并策略 148
9.2 删除对象 153
两步删除法 154
传播删除 156
9.3 唯一性约束 157
9.4 总结 159
IV 进阶话题 161
第10章 谓词 162
10.1 一个简单的例子 162
使用谓词 163
10.2 用代码来创建谓词 164
10.3 格式字符串 165
比较 166
可选类型值 167
日期 168
10.4 合并多个谓词 168
常量谓词 170
10.5 遍历关系 171
子查询 171
10.6 匹配对象和对象ID 172
10.7 匹配字符串 173
字符串和索引 175
10.8 可转换的值 175
10.9 性能和排序表达式 176
10.10 总结 177
第11章 文本 178
11.1 一些例子 178
11.2 搜索 179
字符串标准化 180
高效搜索 182
11.3 排序 183
一种简单的方法 183
更新一个已排序的数组 184
持久化一个已排序的数组 188
11.4 总结 189
重点 189
第12章 数据模型版本以及迁移数据 190
12.1 数据模型版本 190
12.2 数据迁移的过程 192
自动数据迁移 193
手动数据迁移 194
12.3 推断的映射模型 201
12.4 自定义映射模型 202
自定义实体映射策略 204
12.5 数据迁移和用户界面 206
12.6 测试数据迁移 209
调试数据迁移时的输出 210
12.7 总结 210
重点 211
第13章 性能分析 212
13.1 SQL调试输出 212
获取请求 213
填充惰值 217
保存数据 218
13.2 Core Data Instruments 219
13.3 线程保护 222
13.4 总结 222
第14章 关系型数据库基础和SQL 223
14.1 一个嵌入式数据库 223
14.2 数据表、列以及行 224
14.3 数据库系统的结构 225
查询处理器 225
存储管理器 226
事务管理器 226
数据和元数据 226
14.4 数据库语言SQL 227
排序 228
14.5 关系 229
一对一关系 229
一对多关系 230
多对多关系 230
14.6 事务 231
14.7 索引 232
14.8 日志 232
14.9 总结 233