CoreData相关概念
持久存储栈
通过CoreData,我们可以将程序中的对象存储为外部数据,当然也可以将外部数据恢复为程序中的对象,其实这些工作是由CoreData的一系列的类来协作完成的,我们把这些类的集合称为持久存储线,它由以下部分组成:
- 托管对象模型:Managed object model
- 持久化存储:Persistent store
- 持久化存储协调器:Persistent store coordinator
- 托管对象上下文:Managed object context
1.托管对象模型
它可以被理解为数据库模型,表示程序中数据模型的每一个对象类型,对象包含的属性以及对象之间的关系。CoreData栈使用这个模型来创建对象,存储属性以及保存数据
该类负责在运行时加载和表示使用Xcode中数据模型编辑器创建的数据模型
2.持久化存储
它用于读取和存储数据到某种指定类型的存储仓库中。CoreData提供了4种类型的存储仓库,其中3种是原子的,一种是非原子的。这里的原子和原子操作意义不同。这里的原子仓库指的是当你要读或写数据时,必须将整个仓库反序列化并加载到内存中。而非原子仓库则可以只加载一部分数据到内存中即可操作。
仓库的类型有4种:
1、NSQLiteStoreType:后台为SQLite数据库,非原子仓库。轻量化并且占用较少内存,推荐在iOS程序中使用这种仓库。Xcode core data模版默认使用这种仓库。
3.持久化存储协调器
它是Managed object model和Persistent store之间的桥梁。它完成了Core Data中最复杂的部分,这个类理解NSManagedObjectModel,它知道如何发送信息给NSPersistentStore,也知道如何从NSPersistentStore获取数据。
协调器的存在,隔离和隐藏了Persistent store的具体实现和配置方法,因为NSManagedObjectContext不需要了解数据到底是存储到SQLite仓库中,还是存储在其他类型的仓库中。如果程序使用了多个Persistent store,协调器用于向Managed context提供一个统一的接口
4.托管对象上下文
Managed object context是一个内存中的对象,用于和Managed object协同工作,通常情况下,我们接触和使用最多的就是NSManagedObjectContext,其它3个CoreData的类通常只在初始化栈或者做迁移时才会用到。
程序中,我们在Managed object context中完成所有对Core Data对象的操作。任何对数据对象的修改并不会立即生效,直到context的save()操作被调用。Context管理着它创建和Fetch的对象,包括错误处理,Inverse relationship的处理和校验。
Managed object不能脱离Context而存在,Managed object和Context之间是强依懒关系,每个Managed object都有一个它的Context的引用,并且Managed object在它的生命周期内,只属于一个Context。
实体和托管对象
- 实体:在CoreData的使用过程中,我们需要在数据模型的文件中建立数据模型,而且实体可以认为是我们为数据建立的模型,即表示对象的描述。
- 托管对象:表示在运行时创建的该实体的具体实例。
- 实体由属性、关系和提取属性组成,属性是需要存储的数据,关系表示实体间之间的关系,例如一对一,或者一对多,提取属性是关系的备选方法,可以被认为是一个指定的查询结果集。