1. Managed object model
它代表数据模型,以及它们的属性,它们之间的关系。
Core Data的其它部分可以使用它来创建对象,存储属性和保存数据。
可以把NSManagedObjectModel看作是一个数据库(schema)就是比table高一级的那种。
SQLite 是 Core Data 中许多可以用的长期存储类型之一.
xcdatamodel 文件是图形编辑创建方便操作的. 在后台,momc编译器负责编译model 文件到一系列的momd文件夹。
就像Swift 代码被编译和优化使得它可以在设备上运行,编译好的模型也可以在运行时高效地访问. Core Data 在运行时用编译好的momd文件夹里的文件来初始化 NSManagedObjectModel。
2.The persistent store
NSPersistentStore 负责读取和存储。
Core Data提供了四种不同的 NSPersistentStore,三个原子性的(一个事物不能影响另外一个事物),一个非原子性的。
原子性的 persistent store 需要在任何读写操作前被完全反序列化然后加载到缓存。 相反的, 非原子性的 persistent store 可以在需要的时候载入它自身的一部分。
四种内建Core Data 存储类型
- NSQLiteStoreType。 它是的是SQLite实现存储的。他是Core Data支持的唯一的一个非原子性的存储类型,。轻量且高效的内存占用使得它成为了绝大部分 iOS 项目最好的选择. Xcode’s Core Data 模版默认使用这种存储类型。.
- NSXMLStoreType 是由XML文件实现的, 这使得它成为了所有存储类型中最适合人类阅读的类型。这个类型是原子性的, 所以它的内存占用会很大. NSXMLStoreType 仅在 OS X 上支持.
- NSBinaryStoreType 是由二进制数据文件实现存储的,就像NSXMLStoreType, 它也是原子性的存储类型, 所以整个二进制文件必须在需要用到的时候加载整个文件。在实际应用中很少会用到这个类型。
- NSInMemoryStoreType 内存中保存的储存类型。某种意义上来说,他不是一种长期存储。Inaway,this store type is not really persistent. 关闭app或者手机都会使得这种类型的数据消失。虽然看起来不符合Core Data的定义, 但是in-memory 存储类型在单元测试和某些类型的缓存中还是很有用的。
也可以继承NSIncrementalStore 类来自定义存储类型。[官方文档](https://developer.apple.com/library/ios/documentation/DataManagement/
Conceptual/IncrementalStorePG/Introduction/Introduction.html)
3. The persistent store coordinator
NSPersistentStoreCoordinator 是 managed object model 和 persistent store之间的桥梁。它负责使用model和 persistent stores 来完成Core Data中最艰难的工作。比如用NSManagedObjectModel 发送信息给NSPersistentStore和从 NSPersistentStore获取信息。
NSPersistentStoreCoordinator 隐藏了persistent store的配置实现部分的细节。有以下两个好处:
- NSManagedObjectContext (coming next!) 不需要知道知道存储类型是什么,SQLite也好,XML也好,甚至是自定义的存储类型。
- 如果有多个plepersistent stores,persistent store coordinator 会呈现一个统一的接口给 managed context. 对managed context 而言, 它总是在跟一种persistent store打交道。
4. The managed object context
在四个组件中,日常接触最多的就是 NSManagedObjectContext 。 其它几个基本上只有在想要对Core Data做一些高级的操作才会用到。
因为 NSManagedObjectContext 很常用,所以知道contents(上下文环境)是怎么工作的就变得非常重要了。
context可能是managed objects的内存缓存器。
你对 Core Data objects 的所有操作都在managed object context里。
你所有对硬盘上底层数据的改变都只有在调用context里的save()函数后才会真正生效。
Context 管理它创建和获取的对象的生命周期。这些生命周期管理包括强大的功能诸如错误处理,反相关系处理以及数据验证。
-
Managed Object (管理对象)无法在没有关联context(上下文环境) 的情况下存在。事实上,它们俩之间的关系非常紧,每一个managed object 都维持着对它的上下文环境的引用,可以通过以下方式来访问
let managedContext = employee.managedObjectContext
Contexts 是非常专一的。一旦Managed object建立跟特定上下文环境的联系,它会在整个生命周期维持着对同一个contetxt的联系。
一个应用可以使用超过不止一个context,大多数大型app都是这种类型。因为context处于硬盘上的内存高速缓存区,所以可以同时在两个不同的context中加载同一个Core Data 对象。
Context 是线程安全的。Managed object 也是如此。 所以只可以在他们创建时中的同一线程中处理Context和Managed Object之间的交互。
5. The persistent store container
在iOS10中,Apple引入了一个新的类 NSPersistentContainer。这个类是上述四个类的管理类。不需要在浪费时间去写模版性的代码来建立它们四者之间的联系,只需要初始化一个NSPersistentContainer类就可以继续接下来的操作s了。