- CoreData基础
在CoreData中有一些常用的类,称呼可能各不相同。
NSPersistentStoreCoordinator(Persistent Store Coordinator)
,缩写为PSC。
NSManagedObjectContext(Managed Object Context)
,缩写为MOC。
NSManagedObjectModel(Managed Object Model)
,缩写为MOM。
NSManagedObject
及其子类,根据英文翻译和其作用,称之为托管对象。
后缀名为.xcdatamodeld
的文件,因为存储着所有实体的数据结构和表示,所以称之为模型文件。
- CoreData基础
CoreData
是苹果推出的一个数据存储框架。CoreData
提供了一种对象关系映射(ORM
)的存储关系,类似于Java
的hibernate框架。CoreData
可以将OC
对象存储到数据库中,也可以将数据库中的数据转化为OC
对象,在这个过程中不需要手动编写任何SQL
语句,这是系统帮我们完成
CoreData
最大的优势就是使用过程中不需要编写任何SQL语句,CoreData
封装了数据库的操作过程,以及数据库中数据和OC对象的转换过程。所以在使用CoreData
的过程中,很多操作就像是对数据库进行操作一样,也有过滤条件、排序等操作。
这就相当于CoreData
完成了Model
层的大量工作,例如Model
层的表示和持久化,有效的减少了开发的工作量,使Model
层的设计更加面向对象。
CoreData主要的几个类
NSManagedObjectContext
托管对象上下文,进行数据操作时大多都是和这个类打交道。
NSManagedObjectModel
托管对象模型,一个托管对象模型关联一个模型文件(.xcdatamodeld
),存储着数据库的数据结构。
NSPersistentStoreCoordinator
持久化存储协调器,负责协调存储区和上下文之间的关系。
NSManagedObject
托管对象类,所有CoreData
中的托管对象都必须继承自当前类,根据实体创建托管对象类文件。
CoreData简单创建流程
1.模型文件操作
1.1 创建模型文件,后缀名为.xcdatamodeld
。创建模型文件之后,可以在其内部进行添加实体等操作(用于表示数据库文件的数据结构)
1.2 添加实体(表示数据库文件中的表结构),添加实体后需要通过实体,来创建托管对象类文件。
1.3 添加属性并设置类型,可以在属性的右侧面板中设置默认值等选项。(每种数据类型设置选项是不同的)
1.4 创建获取请求模板、设置配置模板等。
1.5 根据指定实体,创建托管对象类文件(基于NSManagedObject
的类文件)
2.实例化上下文对象
2.1 创建托管对象上下文(NSManagedObjectContext)
2.2 创建托管对象模型(NSManagedObjectModel
)
2.3 根据托管对象模型,创建持久化存储协调器(NSPersistentStoreCoordinator
)
2.4 关联并创建本地数据库文件,并返回持久化存储对象(NSPersistentStore
)
2.5 将持久化存储协调器赋值给托管对象上下文,完成基本创建。
下边一张图概括coreData之间的关系:
从图中可以看出,这两部分都是比较独立的,两部分的交互由一个持久化存储调度器(
NSPersistentStreCoordinator
)来控制。上层NSManagedObjectContext
存储的数据都是交给持久化调度器,由调度器调用具体的持久化存储对象(NSPersistentStore
)来操作对应的数据库文件,NSPersistentStore
负责存储的实现细节。这样就很好的将两部分实现了分离。
CoreData
本质还是使用SQLite
进行存储,并没有另外提供加密功能,具体的数据加解密还需要自己完成。
之前听其他人说CoreData
的执行效率不如SQLite
高,这个如果深究的话,确实CoreData
要比SQLite
效率差一些,只不过并没有太大区别。CoreData
本质也是在底层执行SQL
语句,只是CoreData
的SQL
语句执行逻辑比较耗时,没有手动编写SQL
语句更加直接。我们可以将CoreData
的调试功能打开,具体看一下SQL
语句的执行。
客户端毕竟不是服务端,不需要像服务器那样大量的数据查询,所以CoreData
是完全可以应对客户端的查询量的。如果从灵活性来说,CoreData
确实没有SQLite
的灵活性高,一些SQLite
的复杂功能可能也不能实现,但是就目前大多数项目来说,CoreData
已经能够满足项目持久化需求了。
导致执行效率差异的原因还体现在对象转换上,CoreData
在执行SQL
语句的基础上,还多了一层将数据映射给托管对象的操作,这样得到的就是OC
的托管对象,而SQLite
得到的则不是。如果给SQLite
执行完成后,也加一层创建托管对象并赋值的操作,这时候对比性能两者的差距可能就会更小了