简介
Core Data
是一种持久化技术,它能够将模型对象的状态持久化到磁盘.
Core Data的简单示例
使用Core Data的基本流程是:
- 创建
Entity
,指定其名称 - 为Entity添加
Attributes
,指定其名称和数据类型. - 储存
managed object
. - 取得
managed object
.
1 | //储存person |
1 | //取得people数组 |
我们在设置Person的attribute时用到了Cocoa和Cocoa Touch提供的KVC
机制,这个机制的作用是通过字符串间接访问对象的属性.KVC
对所有NSObject
的子类有用,当然包括了NSManagedObject
.在以上代码中,KVC让属性的访问变得有点像访问一个字典.
1 | //通过KVC访问属性 |
在储存和取得managed object时都从appDelegate中取得了managedObjectContext
,那么这个managedObjectContext是什么呢?
NSManagedObjectContext
NSManagedObjectContext
可以看作一个内存中的”便笺”.
关于NSManagedObjectContext
NSManagedObjectContext
可以看作一个内存中的”便笺”.- 我们对Core Data Object的所有操作都可以在
NSManagedObjectContext
里完成.例如,如果我们要储存一个object,我们可以- 取得
managedObjectContext
- 插入object到managedObjectContext
- 保存managedObjectContext
- 取得
- 我们所做的任何操作对已经储存的数据没有任何影响,直到我们调用context的
save ()
方法 context
管理着其创建的对象的生命周期.
5.一个managed object
依靠context
而存在.NSManagedObject的子类
虽然使用KVC
可以让我们把简单的数据储存在Core Data中,但是当在使用KVC时我们必须十分小心,因为小小的拼写错误将导致程序的崩溃,字典式的存取方式也十分不便.因此,我们可以作出改进,我们可以创建自己的NSManagedObject的子类
.利用NSManagedObject的子类,我们将可以在entity
和类之间创建一一对应的关系.通过这种方式让我们更关注对象本身而不是Core Data的操作,并且,再也可以不用字典方的存取方法了.
NSManagedObject的子类的创建
创建一个NSManagedObject的子类
十分简单.
首先在
.xcdatamodel
文件中创建一个entity
并添加attributes
,设置好attribute
的名称和数据类型.Editior->Create NSManagedObject Subclass
- 选择
Data Model
和Entity
可以看到,**.swift
和**+CoreDataProperties.swift
已经被创建出来了.
@NSManaged
在生成的NSManagedObject
类中,我们可以看到属性前被加上了@NSManaged
修饰词.在通常的情况下,属性是通过实例变量被储存在内存中的.而一个managed object的情况有所不同,它被储存在managed object context
中,所以数据源在编译时是不可知的.
NSManagedObject的子类的储存,捉取和删除
储存
- 取得Entity
- 创建NSManagedObject的子类的对象.
- 按照需求修改对象的属性.
- 插入对象到便笺中.
- 保存便笺.
1 | let entity = NSEntityDescription.entityForName("Dog", |
捉取
- 生成
NSFetchRequest
对象,构造其predicate
. - 利用
NSFetchRequest
,从便笺中取得NSManagedObject
.
删除
- 取得要删除的NSManagedObject的子类对象
- 在
context
中删除该对象 - 保存context
1 | let dogToRemove = |
Core Data Stack
直到现在,我们只接触过NSMangedObjectContext
和NSManagedObject
,储存对象时,我们只需调用NSMangedObjectContext
的save()
方法.但是,在调用save()
方法后究竟发生了些什么?想深一步了解Core Data,就必须介绍Core Data Stack
.
Core Data Stack的组成
Core Data Stack由以下四个类组成:
- NSManagedObjectModel
- NSPersistentStore
- NSPersistentStoreCoordinator
- NSManagedObjectContext
NSManagedObjectModel
代表了每一个在应用数据模型中的被管理对象模型
NSPersistentStore
NSPersistentStore负责向指定的储存方法(SQLite、XML、二进制文件、InMemory)执行数据读写
NSPersistentStoreCoordinator
NSPersistentStoreCoordinator是被管理对象模型和PersistentStore之间的桥梁.它从NSPersistentStore中取得对象,向NSManagedObjectContext隐藏了NSPersistentStore的实现,使得NSManagedObjectContext只关心一个统一的NSPersistentStore.
NSManagedObjectContext
上文已经提及.