前言

每天都有无数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》[1](请搜索apple.com网站)

本书结构

本书将指导你完成Grocery DudeGrocery 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)

[1] 该文档现已更名为《About Objective-C》,网址是:https://developer.apple.com/library/Mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html。——译者注