[swift]swift4.0 CoreData的使用

    • CoreData基础
      在CoreData中有一些常用的类,称呼可能各不相同。
      NSPersistentStoreCoordinator(Persistent Store Coordinator),缩写为PSC。
      NSManagedObjectContext(Managed Object Context),缩写为MOC。
      NSManagedObjectModel(Managed Object Model),缩写为MOM。
      NSManagedObject及其子类,根据英文翻译和其作用,称之为托管对象。
      后缀名为.xcdatamodeld的文件,因为存储着所有实体的数据结构和表示,所以称之为模型文件。

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之间的关系:

CoreData结构图

从图中可以看出,这两部分都是比较独立的,两部分的交互由一个持久化存储调度器(NSPersistentStreCoordinator)来控制。上层NSManagedObjectContext存储的数据都是交给持久化调度器,由调度器调用具体的持久化存储对象(NSPersistentStore)来操作对应的数据库文件,NSPersistentStore负责存储的实现细节。这样就很好的将两部分实现了分离。

CoreData本质还是使用SQLite进行存储,并没有另外提供加密功能,具体的数据加解密还需要自己完成。

之前听其他人说CoreData的执行效率不如SQLite高,这个如果深究的话,确实CoreData要比SQLite效率差一些,只不过并没有太大区别。CoreData本质也是在底层执行SQL语句,只是CoreDataSQL语句执行逻辑比较耗时,没有手动编写SQL语句更加直接。我们可以将CoreData的调试功能打开,具体看一下SQL语句的执行。

客户端毕竟不是服务端,不需要像服务器那样大量的数据查询,所以CoreData是完全可以应对客户端的查询量的。如果从灵活性来说,CoreData确实没有SQLite的灵活性高,一些SQLite的复杂功能可能也不能实现,但是就目前大多数项目来说,CoreData已经能够满足项目持久化需求了。

导致执行效率差异的原因还体现在对象转换上,CoreData在执行SQL语句的基础上,还多了一层将数据映射给托管对象的操作,这样得到的就是OC的托管对象,而SQLite得到的则不是。如果给SQLite执行完成后,也加一层创建托管对象并赋值的操作,这时候对比性能两者的差距可能就会更小了

你可能感兴趣的:([swift]swift4.0 CoreData的使用)