正如大家所想,直接使用SQLite API 来操作数据库虽然并不复杂,但由于这种操作方式并不是面向对象的因此与Objective-C的编程思维并不相同。为了解决这个问题,iOS提供了Core Data 框架,这个框架本质就是一个ORM框架,它允许开发者以面向对象的方式持久化操作SQLite 数据库。
简单的说,Core Data 是一个纯粹的面向对象的框架,可用来管理实体以及实体之间的关联关系的持久化——所谓持久化,指的是Core Data 可以将实体保存到持久化存储设备中,也可以在需要的时候将它们取出。
Core Data 底层的持久化存储方式可以是SQLite 数据库,也可以是XML文档, 甚至可以直接以内存作为持久化存储设备(当然,如果选择内存作为持久化存储设备,那么应用重启时,数据就会丢失)。
Core Data 的核心概念是实体。实体是由Core Data 管理(简称被托管)的模型对象,它必须是NSManagedObject 类或其子类的实例。实体与实体之间存在1-1、1-N、N-N的关联关系,整个应用的所有实体以及实体之间的关联关系被称为托管对象模型(NSManagedObjectModel).
Core Data 的核心对象是托管对象上下文(NSManagedObjectContext,有时也简称上下文),所有实体都处于托管对象上下文管理中,Core Data 应用对实体所做的任何CURD(增、删、改、查)操作都必须通过托管上下文来完成。
开发者开发的应用程序需要通过NSManagedObjectContex 对实体进行CURD操作,而NSManagedObjectContex 底层与持久化存储协调器(NSPersistentObjectCoordinator)衔接,持久化存储协调器则负责管理底层的存储形式(比如SQLite)。
下图显示了Core Data 应用中各种对象之间的关系
Core Data 应用中的核心API有如下几个:
>>托管对象模型(NSManagedObjectModel):该对象负责管理整个应用的所有实体以及实体之间的关联关系。这个模型包含实体(Entity),特性(Property),读取请求(Fetch Request)等。
>>持久化存储协调器(NSPersistentObjectCoordinator):负责管理底层的存储文件,例如SQLite数据库等,一般我们不需要和它打交道。
>>托管对象上下文(NSManagedObjectContext):该对象是Core Data 的核心对象,应用程序对实体所做的CURD操作都需要通过该对象来完成。
>>实体描述(NSEntityDescription):该对象代表了关于某个实体的描述信息,从某种程度来说,该对象相当于实体的抽象。
>>抓取请求(NSFetchRequest):该对象封装了查询实体的请求,包括程序需要查询哪些实体、查询条件、排序规则等。
这些模块是怎样运行的呢?
1> 创建 NSManagedObjectModel 对象来加载管理应用的托管对象模型。
2> 以 NSManagedObjectModel 对象为基础,根据实际需要创建 NSPersistentObjectCoordinator 对象,该对象确定 Core Data 底层数据的存储形式。
3> 以 NSManagedObjectModel 对象为基础,创建NSManagedObjectContex,该对象是 Core Data 进行持久化访问的核心对象。
4> 对于普通的增、删、改操作,需要分别先新建实体、删除实体、修改实体、然后调用NSManagedObjectContex 对象的save:方法,将这些修改保存到底层的存储设备。
5> 如果要执行查询操作,则需要先创建 NSFetchRequest 对象,再调用 NSManagedObjectContext 的 executeFetchRequest:error 方法执行查询,该方法返回所有匹配条件的实体组成的NSArray 。