Core Data应用开发实践指南

更多详情

内容简介: 本书通过大量实例深度剖析Core Data应用开发的全过程,不仅详细讲解7Core Data的基础知识、功能特性、新的编程范式和实用开发技巧,而且还讲解了Core Data如何与iCloud和StackMob集成,可以帮助读者迅速掌握Core Data的用法并具备实战能力。
本书共分16章:第1章讲解Core Data应用程序的基础知识并演示如何为范例程序添加Core Data支持;第2~4章介绍托管对象模型的基础知识、迁移和扩展;第5章探讨如何用Core Data及获取结果控制器来驱动表格视图;第6章展示怎样在应用程序里传递托管对象;第7章讲解如何把由Core Data所驱动的选取器视图添加到编辑视图中;第8章解释如何用XML中的默认数据来生成持久化存储区;第9章讲解如何利用深拷贝从选定的实体中把对象与关系由一个持久化存储区拷贝至另一个存储区中;第10章探讨女口何用Instruments来判断并解决性能问题;第11章讲解如何由后台进程来处理任务;第土2章介绍在CoreDataTVC里如何实现高效的搜索功能;第13章讲解如何创建备份文件,以及如何用Dropbox的Sync API来同步文件;第14章讲解 Core Data与iCloud的集成;第15章介绍如何进一步提升Core Data与iCloud的集成幅度;第16章通过StackMob来介绍如何在多个用户之间进行跨平台的数据分享及协作。

目录: 《Core Data应用开发实践指南》
译者序
前 言
第1章初次尝试Core Data应用程序1
1.1 Core Data是什么1
1.2 Core Data的适用场合4
1.3 创建Grocery Dude项目5
1.4 为现有的应用程序添加Core Data支持6
1.5 小结15
1.6 习题15
第2章托管对象模型的基础知识17
2.1 托管对象模型是什么17
2.2 添加托管对象模型18
2.3 实体18
2.4 属性20
2.5 Integer 16、Integer 32与Integer 6421
2.6 单精度浮点数与双精度浮点数22
2.7 属性的各种设置选项25
2.8 创建NSManagedObject的子类27
2.9 Scalar Properties for Primitive Data Types选项28
2.10 代码片段:demo方法29
2.11 创建托管对象29
2.12 后端SQL的可见性31
2.13 获取托管对象34
2.14 删除托管对象39
2.15 小结40
2.16 习题40
第3章托管对象模型的迁移42
3.1 修改托管对象模型42
3.2 添加模型版本43
3.3 轻量级的迁移方式45
3.4 默认的迁移方式48
3.5 通过迁移管理器来迁移数据52
3.6 小结62
3.7 习题63
第4章托管对象模型的扩展64
4.1 关系64
4.2 Delete规则69
4.3 数据验证错误73
4.4 实体继承77
4.5 小结81
4.6 习题81
第5章表格视图82
5.1 表格视图基础82
5.2 由Core Data所驱动的表格视图83
5.3 创建CoreDataTVC84
5.4 DELEGATE:NSFetchedResultsController88
5.5 AppDelegate的CoreDataHelper实例93
5.6 创建PrepareTVC94
5.7 创建ShopTVC105
5.8 小结110
5.9 习题110
第6章视图111
6.1 概述111
6.2 范例程序所需的视图层级112
6.3 创建ItemVC113
6.4 DELEGATE: UITextField 121
6.5 货品的计量单位、在家中的位置以及在商店中的位置127
6.6 小结141
6.7 习题141
第7章选取器视图143
7.1 概述143
7.2 创建CoreDataPickerTF144
7.3 DELEGATE+DATASOURCE:UIPickerView146
7.4 创建UnitPickerTF151
7.5 创建LocationAtHomePickerTF158
7.6 创建LocationAtShopPickerTF160
7.7 使选取器不遮住文本框167
7.8 小结170
7.9 习题170
第8章预先加载数据171
8.1 默认的数据171
8.2 判断应用程序是否需要导入数据172
8.3 从XML中导入数据174
8.4 创建导入默认数据所需的上下文177
8.5 防止重复导入默认数据178
8.6 触发导入默认数据的操作178
8.7 创建CoreDataImporter180
8.8 选定各实体的Unique 属性185
8.9 把XML中的数据映射到实体的属性186
8.10 从持久化存储区中导入数据189
8.11 小结192
8.12 习题193
第9章深拷贝194
9.1 概述194
9.2 配置拷贝源数据所用的Core Data栈197
9.3 增强CoreDataImporter类200
9.4 触发深拷贝210
9.5 小结214
9.6 习题214
第10章性能216
10.1 发现性能问题216
10.2 实现拍照功能217
10.3 生成测试数据222
10.4 用SQLDebug测量性能225
10.5 用Instruments测量性能227
10.6 改善程序性能229
10.7 清理237
10.8 小结237
10.9 习题237
第11章后台处理239
11.1 后台保存239
11.2 后台处理244
11.3 建立Faulter类245
11.4 建立Thumbnailer类249
11.5 小结254
11.6 习题254
第12章搜索256
12.1 修改CoreDataTVC类257
12.2 修改PrepareTVC类264
12.3 小结268
12.4 习题268
第13章与Dropbox相结合的备份与恢复270
13.1 与Dropbox相集成271
13.2 在CoreDataHelper类中准备相关代码279
13.3 构建DropboxHelper类280
13.4 构建DropboxTVC类287
13.5 小结297
13.6 习题298
第14章 iCloud300
14.1 概述300
14.2 启用iCloud302
14.3 为CoreDataHelper类添加iCloud功能303
14.4 Debug Navigator310
14.5 禁用iCloud310
14.6 小结316
14.7 习题316
第15章 iCloud高级使用技巧318
15.1 去除重复数据318
15.2 散播数据327
15.3 打造干净的开发环境333
15.4 Core Data程序的配置335
15.5 收尾工作336
15.6 小结337
15.7 习题337
第16章与Web服务相集成343
16.1 StackMob简介343
16.2 StackMob SDK345
16.3 创建StackMob应用程序346
16.4 准备托管对象模型347
16.5 配置StackMob客户端349
16.6 SAVING 351
16.7 响应底层数据的变更353
16.8 自动生成Schema354
16.9 Schema的权限356
16.10 认证358
16.11 使程序保持响应369
16.12 小结370
16.13 习题371
附录A 为第1章的Grocery Dude程序所做的准备工作372
附录B 为第16章的Grocery Cloud程序所做的准备工作377

译者序: 在开发iOS应用程序的时候,经常需要考虑怎样管理数据,而Core Data正是一种易于使用的数据管理框架。若想系统地掌握Core Data的用法,那不妨花点时间看看这本书。与讲解Core Data的其他教材相比,本书有几个特点值得关注。
首先,它用Grocery Dude购物管理程序来贯穿Core Data的各项知识点,使读者能够以直观流畅的方式学会多种实用技巧,并且可以把在范例项目里学到的经验运用于自己的项目中。其次,它将全过程分解为很多章节,再将这些章节细分为若干步骤。这种循序渐进的讲解形式,令读者能够及时检视自己的学习进度,而且还能够清楚地了解每个知识点对于项目功能所起的作用。你只需把这些步骤稍加改编,即可将其推广到其他项目。最后,每章后面都有数道习题,这些习题不仅有助于培养读者的试验能力,而且还能够为深入研究Core Data提供一些线索。
本书内容可以分成三部分。前7章可以视为基础篇。一开始我们就会知道Core Data的适用场合,并且学会怎样为现有程序添加Core Data支持。其后,本书作者从基础知识、迁移方式及扩展方式这三个角度来讲解Core Data的托管对象模型。学会它的用法之后,作者将向大家演示怎样用图形界面来操作Core Data数据,具体来说,就是怎样用表格视图、视图及选取器视图这三种界面,打造一款简单而易用的Core Data程序。对于想要迅速学会Core Data的程序员来说,看完这7章之后,应该就能初步做出一款得体的Core Data程序了。
第8~12章可以看作进阶篇,作者深入讲解了如何为程序配备默认数据、如何更加精细地控制数据迁移、如何实现高效率的数据搜索等主题。其中,第10章尤为精彩,作者给程序添加了拍照功能,并以此为例,演示怎样寻找程序的性能瓶颈、怎样用各种工具来分析造成瓶颈的原因,以及怎样解决性能瓶颈。这种处理问题的思路,对于我们制作其他软件产品也是很有启发的。
最后4章应该算是扩展篇,通过与各种网络框架相集成,我们能够优雅地实现数据备份、数据恢复、多台设备间的数据同步以及多人协作等功能,从而进一步提高Core Data应用程序的品质。虽说作者是以Dropbox、iCloud及StackMob为例来讲解的,但大家也可以用类似的方式把Core Data程序与其他的云端硬盘或网络服务集成起来。
在翻译过程中,我得到了机械工业出版社华章公司诸位编辑与工作人员的帮助,在此深表谢意,还要感谢goldlion及ChenGe两位友人对术语翻译工作所提的建议。
由于时间仓促,译者水平有限,错误与疏漏之处在所难免,敬请各位读者批评指正。你可发邮件至eastarstormlee@gmail.com与我联系,也可访问http://agilemobidev.com/eastarlee/book/learning-core-data-for-ios/?variant=zh-hans网页留言。如果对某些术语的翻译有意见或建议,欢迎来https://github.com/jeffreybaoshenlee/IT-Terms-EN-CN/issues一起讨论。
爱飞翔

前言: 每天都有无数Apple设备运行着依赖于Core Data的应用程序。这使得Core Data成了一个成熟、稳定且非常快速的平台,以供应用程序访问其数据。Core Data本身并不是数据库,它其实是一个拥有诸多功能的框架,而其中一项功能就是把应用程序同数据库之间的交互过程自动化。有了它之后,就不用再编写SQL代码了,而是可以改用Objective-C对象来做。这样一来,既能享受到关系型数据库的好处,又无须在Objective-C代码中编写、测试并优化SQL查询语句。Core Data会在幕后自动生成SQL代码,而Apple公司的专业技术人员已经对这种SQL代码做了多年的改良与优化。使用Core Data不仅能缩短应用程序开发时间,而且还能显著减少开发者所要编写的代码量。
Core Data的显著特性有:
变更管理(撤销与重做)
关系(relationship)
数据模型的版本管理及迁移
(通过batching及faulting)高效地获取数据
(通过谓词)高效地过滤数据
数据一致性及数据验证
本书将介绍Core Data的特性及最佳实践技巧。在学习各章的过程中,你会明白如何从头开始构建一款功能完备的Core Data iPhone应用程序。笔者会详细解释每个关键的知识点,使你能够直接把学到的内容付诸实践。本书所展示的范例程序会尽量把Core Data的各个方面都纳入其中。同时,它还是个已在App Store上架的真实应用程序。这更有助于你把学到的知识与现实工作中的场景联系起来。
随着iOS 7的到来,Core Data与iCound之间的集成在速度、可靠性及简洁程度上都有了大幅改观。对原来放弃了这项技术的人,笔者建议你再试一次,这回肯定能给你带来惊喜。
如果你想对本书内容提供反馈、bug修复及勘误,或想为本书后续版本出力,请通过电子邮箱timroadley@icloud.com联系笔者。最后,感谢你关注此书。笔者花了大量时间来精心编排内容,也衷心希望它能帮助你掌握Core Data这项出色的技术。
本书的目标读者
本书写给那些想在iOS app中高效管理数据的Objective-C程序员。如果原来有数据库方面的经验,那么某些内容学起来可能会快一些,但没有数据库经验的程序员也同样可以阅读本书。某些固守旧习的SQL程序员可能很难适应Core Data的一些用法。但无论你的技术背景是什么,都无需担心,因为笔者会把每个步骤都解释得非常清楚。
学习本书所需的材料和知识
身为Objective-C程序员,你应该装有比较新的Mac系统,并运行Xcode 5或更新的版本。同时还应该非常熟悉Xcode并且拥有一部iOS设备,以便测试。iOS设备对本书第10章尤其重要,因为整章都在谈设备性能问题。
你应该知道Objective-C中一些术语的含义,例如property(特性)、method(方法)、delegate(代理)、class(类)和class instance(类实例)。若你无法确定本书是否适合自己,建议你先看看下面这些资料:
《iOS Programming: The Big Nerd Ranch Guide》 (请搜索amazon.com网站)
《The iOS Newbie Tutorial Series》(请搜索timroadley.com网站)
《Learning Objective-C: A Primer》 (请搜索apple.com网站)
本书结构
本书将指导你完成Grocery Dude与Grocery Cloud的整个构建过程,二者均是在App Store上架的应用程序。Grocery Dude演示了Core Data如何与iCound集成,而Grocery Cloud则演示了Core Data如何与StackMob集成。本书的每一章都要用到上一章所讲的知识,而按照各章顺序也会看到所需实现的内容。在这个过程中,我们要构建一些辅助类(helper class),以便更快地重新部署已经完成的这部分应用程序。实际上,第15章最后的那个习题就会引导你把这些辅助类重新部署到既有的非Core Data应用程序上面。你很快就能拥有一款功能完备的Core Data app了,它会与iCound可靠地集成起来。
现将每章内容简述如下:
第1章 初次尝试Core Data应用程序—此章是本书的基础,笔者会在其中介绍Core Data的基本概念,还会告诉你关于Core Data的两个重要方面,就是“它能做什么”以及“它不能做什么”。此外,还会实现CoreDataHelper类,用以演示如何将Core Data同既有的应用程序相集成。
第2章 托管对象模型的基础知识—这一章将对比传统数据库模式的设计与Core Data之间有何共性,并介绍数据模型。在讨论实体(entity)和属性的时候,你将看到如何配置基本的托管对象模型(managed object model),同时笔者还会给出建议,告诉你如何选择合适的数据类型。此外还会讲解怎样插入、获取、过滤、排序及删除“托管对象”,其后还会介绍获取请求(fetch request)模板。
第3章 托管对象模型的迁移—本章将会讲解三种迁移方式,分别是:轻量级迁移、默认迁移以及采用迁移管理器来迁移,其中,迁移管理器可以显示迁移的进度。你将学到如何在各种迁移方式之间做出明智的抉择,同时还将学会适应Core Data的模型版本管理(model-versioning)功能。
第4章 托管对象模型的扩展—笔者会解释各种关系并将其添加到Grocery Dude程序中,此时关系数据模型的强大之处就能体现出来了。模型的其他特性,诸如抽象实体及父实体也会在这一章里讲到,同时笔者还会告诉你一些处理数据验证错误的技术。
第5章 表格视图—用Core Data及获取结果(fetched result)控制器来驱动表格视图(table view),既可节省内存,又能提升效率,而且这么做也会令应用程序初具规模。当然,大部分的例行任务都是由CoreDataTVC来完成的,这是个可以复用的子类,继承自UITableViewController。只需把这个子类放到你自己的应用程序里,就能轻松地部署好一份由Core Data所驱动的表格视图了。
第6章 视图—本章将展示怎样在应用程序里传递托管对象,由此可以学会如何操作它们。在表格视图里选定的对象可以传给下一个视图,以供编辑。本章会给Grocery Dude加上编辑用的界面,以演示如何操作传过来的对象,并且还会演示如何将其存回持久化存储区里面。
第7章 选取器视图—本章会把由Core Data所驱动的选取器视图(Picker View)添加到编辑视图里面,这样可以令应用程序更加精致。用户可以通过选取器视图将某种计量单位、家庭住址或商铺地址快速地设定到现有的货品上面。笔者专门制作了一个可以复用的子类—CoreDataPickerTF,它继承自UITextField,当用户点击相关的文本框时,这个子类可以用由Core Data所驱动的选取器视图来取代默认的输入键盘。
第8章 预先加载数据—本章将会解释如何用XML中的默认数据来生成持久化存储区,同时还会介绍通用的辅助类CoreDataImporter。为Grocery Dude程序准备好持久化存储区之后,笔者将演示如何判断是否需要导入默认数据(有时用户可能根本不想导入数据)。
第9章 深拷贝—与migratePersistentStore相比,深拷贝(deep copy)更加灵活也更加精细,它可以从选定的实体中把对象与关系由一个持久化存储区拷贝到另一个存储区中。本章将改进CoreDataImporter这个辅助类,为其增加深拷贝功能。
第10章 性能—编写Core Data应用程序的时候,很容易出现一些常见的性能问题,你将会通过本章学到如何用Instruments来判断并解决这些问题,并可以由此积累经验。笔者给程序加入照相功能,是为了把性能问题凸现出来,从而使大家明白:要想编出性能优秀的应用程序,就必须把模型设计好。
第11章 后台处理—性能一流的程序会把繁重的处理任务转交给后台线程来做。笔者将通过名为Thumbnailer的辅助类来添加相片缩略图生成功能,由此你会看到在后台处理任务其实是非常简单的。
第12章 搜索—本章将会在CoreDataTVC里实现高效的搜索功能,你将学到如何在同一个表格视图中处理两个获取结果控制器。
第13章 与Dropbox相结合的备份与恢复—本章将会讲解如何创建备份文件以及如何用Dropbox的Sync API来同步这些文件。我们还会实现数据恢复功能:用户只需按一下按钮,就能把同一个Dropbox账户中的数据恢复到任意iOS设备中。
第14章 iCloud—本章将会讲解Core Data与iCloud的集成,这种集成方式目前是最简单、最可靠的。iCloud可以安全地处理多个账户及各种配置信息,不会有丝毫损失。
第15章 iCloud高级使用技巧—本章将会进一步提升Core Data与iCloud的集成幅度,以实现实体级别的数据散播(entity-level seeding)及去除重复数据(de-duplication)的功能(该功能可以保证每个对象只存储一份)。此外,你还会学到如何通过正确的方式来准确地模拟用户第一次使用iCloud时的情形,这种方式可以把相关的内容全部重置。
第16章 与Web Service相集成—本章通过StackMob来介绍如何在多个用户之间进行跨平台的数据分享及协作。StackMob是个极为优秀的免费BaaS(Backend-as-a-Service的缩写),它直接提供了针对Core Data的iOS API。StackMob允许笔者在书中使用其美术资源,并且对本书第16章有所帮助,笔者在此对StackMob表示感谢。
附录A 为第1章的Grocery Dude程序所做的准备工作—本书第1章要以Grocery Dude程序为起点展开讲解,为了更完整地演示此程序的制作过程,笔者把程序里面与Core Data无关的步骤都放在了这个附录中。
附录B 为第16章的Grocery Cloud程序所做的准备工作—本书第16章要以Grocery Cloud程序为起点展开讲解,为了更完整地演示此程序的制作过程,笔者把程序里面与Core Data无关的步骤都放在了这个附录中。
范例代码获取方式
本书范例代码均可从timroadley.com网站下载。每一章都会给出相关的链接,也可以参考表1,该表按照实现的先后顺序列出了各范例代码的下载链接。
表1 Grocery Dude代码下载链接汇总
请注意,有时候一行代码会比较长,从而超出了书的宽度。在这种情况下,笔者用“代码接续箭头”()来表示换行。例如:
致谢
首先感谢Trina MacDonald给了我写作本书的机会,她在成书过程中亦对笔者提供了莫大的帮助,而Rich Warren、Carl Brown、Mark Granoff及Ricky O扴ullivan这四位技术评审也做得相当出色。笔者熬夜写书时肯定出了一些差错,你们都帮着找了出来,并提供了一些独到的见解和代码编写技巧。此外还要特别感谢Betsy Gratner、Olivia Basegio、Bart Reed、Sheri Cain、Chris Zahn及Matt Vaznaian在成书过程中对笔者的协助。
—Tim Roadley(Twitter用户名:@TimRoadley)