Farlanki

学习Core Data

字数统计: 1.1k阅读时长: 4 min
2015/12/12 Share

简介

Core Data 是一种持久化技术,它能够将模型对象的状态持久化到磁盘.

Core Data的简单示例

使用Core Data的基本流程是:

  1. 创建Entity,指定其名称
  2. 为Entity添加Attributes,指定其名称和数据类型.
  3. 储存managed object.
  4. 取得managed object.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//储存person
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

let managedContext = appDelegate.managedObjectContext

let entity = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedContext)

let person = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)

person.setValue(name, forKey: "name")

do{
try managedContext.save()
}
catch
{
print(error)
}

self.people.append(person)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//取得people数组
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext

let fetchRequest = NSFetchRequest(entityName: "Person")

do{
let fetchResults = try managedContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]
if let results = fetchResults{
people = results
}
else{
}
}
catch{}

我们在设置Person的attribute时用到了Cocoa和Cocoa Touch提供的KVC机制,这个机制的作用是通过字符串间接访问对象的属性.KVC对所有NSObject的子类有用,当然包括了NSManagedObject.在以上代码中,KVC让属性的访问变得有点像访问一个字典.

1
2
//通过KVC访问属性
cell.textLabel?.text = person.valueForKey("name") as! String?

在储存和取得managed object时都从appDelegate中取得了managedObjectContext,那么这个managedObjectContext是什么呢?

NSManagedObjectContext

NSManagedObjectContext可以看作一个内存中的”便笺”.

关于NSManagedObjectContext

  1. NSManagedObjectContext可以看作一个内存中的”便笺”.
  2. 我们对Core Data Object的所有操作都可以在NSManagedObjectContext里完成.例如,如果我们要储存一个object,我们可以
    • 取得managedObjectContext
    • 插入object到managedObjectContext
    • 保存managedObjectContext
  3. 我们所做的任何操作对已经储存的数据没有任何影响,直到我们调用context的save ()方法
  4. context管理着其创建的对象的生命周期.
    5.一个managed object依靠context而存在.

    NSManagedObject的子类

    虽然使用KVC可以让我们把简单的数据储存在Core Data中,但是当在使用KVC时我们必须十分小心,因为小小的拼写错误将导致程序的崩溃,字典式的存取方式也十分不便.因此,我们可以作出改进,我们可以创建自己的NSManagedObject的子类.利用NSManagedObject的子类,我们将可以在entity和类之间创建一一对应的关系.通过这种方式让我们更关注对象本身而不是Core Data的操作,并且,再也可以不用字典方的存取方法了.

NSManagedObject的子类的创建

创建一个NSManagedObject的子类十分简单.

  1. 首先在.xcdatamodel文件中创建一个entity并添加attributes,设置好attribute的名称和数据类型.

  2. Editior->Create NSManagedObject Subclass

  3. 选择Data ModelEntity

可以看到,**.swift**+CoreDataProperties.swift已经被创建出来了.

@NSManaged

在生成的NSManagedObject类中,我们可以看到属性前被加上了@NSManaged修饰词.在通常的情况下,属性是通过实例变量被储存在内存中的.而一个managed object的情况有所不同,它被储存在managed object context中,所以数据源在编译时是不可知的.

NSManagedObject的子类的储存,捉取和删除

储存

  1. 取得Entity
  2. 创建NSManagedObject的子类的对象.
  3. 按照需求修改对象的属性.
  4. 插入对象到便笺中.
  5. 保存便笺.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let entity = NSEntityDescription.entityForName("Dog",
inManagedObjectContext: managedContext)

//取得Entity
let dog = Bowtie(entity: entity!,
insertIntoManagedObjectContext: managedContext)
//创建NSManagedObject的子类的对象,并插入到Context中
dog.name = "Bob"
//修改属性
do {
try managedContext.save()
} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
}
//保存context

捉取

  1. 生成NSFetchRequest对象,构造其predicate.
  2. 利用NSFetchRequest,从便笺中取得NSManagedObject.

删除

  1. 取得要删除的NSManagedObject的子类对象
  2. context中删除该对象
  3. 保存context
1
2
3
4
5
6
7
8
9
10
11
        let dogToRemove =
dogs[indexPath.row] as! dog
//取得要删除的NSManagedObject的子类对象
managedContext.deleteObject(dogToRemove)
// 在context中删除该对象
do {
try managedContext.save()
// 保存context
} catch let error as NSError {
print("Could not save: \(error)")
}

Core Data Stack

直到现在,我们只接触过NSMangedObjectContextNSManagedObject,储存对象时,我们只需调用NSMangedObjectContextsave()方法.但是,在调用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

上文已经提及.

CATALOG
  1. 1. 简介
  2. 2. Core Data的简单示例
  3. 3. NSManagedObjectContext
    1. 3.1. 关于NSManagedObjectContext
  4. 4. NSManagedObject的子类
    1. 4.1. NSManagedObject的子类的创建
    2. 4.2. @NSManaged
    3. 4.3. NSManagedObject的子类的储存,捉取和删除
      1. 4.3.1. 储存
      2. 4.3.2. 捉取
      3. 4.3.3. 删除
  5. 5. Core Data Stack
    1. 5.1. Core Data Stack的组成
      1. 5.1.1. NSManagedObjectModel
      2. 5.1.2. NSPersistentStore
      3. 5.1.3. NSPersistentStoreCoordinator
      4. 5.1.4. NSManagedObjectContext