Core Data包含的内容非常丰富,这篇文章是关于Core Data的比较基础和常用的内容;包括Core Data的组成,和如何在应用中构建和使用Core Data。主要包括以下内容:
- 什么是Core Data
- Core Data 栈
- 建立一个Core Data驱动的应用
- 使用Core Data操作数据
1、什么是Core Data
Core Data是一种基于数据模型的数据管理解决方案,是苹果提供的关系-对象映射的原生解决方案。在iOS系统架构中位于核心服务层,使用接口是一组Objective-C的类;它是设计用来与MVC设计模式协同工作的,部分工作可以用图形化的方式进行编辑;
不同于关系型数据库,Core Data并不在意值,它关注的是对象;从Core Data中取出信息时,它会创建并返回一个装有受控对象的数组。Core Data会自动对结果数据的值进行包装,封装成应用中使用的模型对象,然后将这些对象当作获取操作的结果返回。
2、Core Data栈
Core Data栈可由下面的Core Data架构示意图展示,下图将Core Data栈中的各种参与者以及它们之间的互动展示出来,描述了Core Data的工作过程。Core Data栈是由以下内容构成的:
- 受控对象模型
- 持久化存储调度器
- 持久化存储和存储文件
- 受控对象上下文
2.1、受控对象模型
受控对象模型(managed object model),简称对象模型,负责定义应用中的数据结构。对象模型存储在可视化文件中,扩展名为.xcdatamodeld。它可以用一个图形化界面工具来编辑,即Core Data数据模型编辑器(见下图)。
在上图中显示了Core Data模型编辑器的工作区界面,图中对象模型定义了一个Person实体,实体包含了几个简单的属性。
在一个受控对象模型中,每个对象(Objective-C类)都被称为一个实体(entity)。每个实体都有自己单独的一个列表,其中列出了属性(attribute)、关系(relationship)、和衍生属性(fetched property)。
可以将属性(attribute)看作是自己定义对象时使用的实例属性,如上图中的id、name等。关系定义了单个实体彼此之间的联系。
派生属性也表示了对象模型中实体间的联系。关系和派生属性的区别在于,关系是双向的(双方对象都知道关系的存在),而派生属性只是单向的。
在图形工作区创建完对象模型之后,就可以用Xcode来自动生成受控对象类了。在Xcode的菜单中新建文件,在新建的对话框中选择Core Data文件类型,选择NSManagedObject作为基类并单击Next(见下图)。之后,可以在对话框中选择所有需要创建对象类的实体,之后,就可以生成这些子类了,生成的类包括选中的实体类(如Person类),还有实体和Core Data属性相关的分类。
2.2、持久化存储调度器
Core Data栈中,其次重要的元素就是持久化存储调度器。通过受控对象模型,可以创建一个持久化存储调度器。这个对象模型定义的实体和关系会受该调度器的管理。
持久化存储调度器在Core Data中基本上是一个自动的过程。除了一开始的创建过程之外,在应用的整个生命周期中,并不需要操作这个调度器。大多数使用core data的iOS应用,都是围绕单个数据库设计的。
但是如果一个应用拥有多个存储文件,调度器的用处就会凸显出来,它会管理底层的存储,而给开发者提供一个单一的受控对象上下文,使得使用起来更方便。
2.3、持久化存储和存储文件
在使用Core Data时,需要在文件系统中创建一个新的数据库文件的持久化存储。持久化存储其实就是对实际的数据库文件的一种Objective-C的表示方式。不用自己去创建新的持久化存储,只要确定了存储类型、配置、URL和选项之后,就可以将新的持久化存储直接添加到一个已有的调度器中。
下面的代码创建了一个新的持久化存储:
//获取沙盒document路径
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
//为数据库文件创建一个URL
NSURL *storeURL = [[NSURL URLWithString:documentPath] URLByAppendingPathComponent:@"DemoCoreData.sqlite"];
//创建持久化存储
NSError *error = nil;
NSPersistentStore *store;
//coordinator为NSPersistentStoreCoordinator的对象,属于持久化存储调度器
store = [coordinato