什么是 Core Data?

Core Data is an object graph management and persistence framework in the OS X and iOS SDKs.
说得通俗一点,就是可以永久保存你定义对象的一个框架,可以理解成数据库。

Core Data 中的术语

  • entity - 可以理解为 Core Data 中的类,数据库中代表一个 table
  • attribute - entity 中的一部分信息,可以理解为类中的 property,数据库中是 table 中的一块特定区域
  • relationship - 多个 entity 之间的连接
    • to-one relationships - 单对单
    • to-many relationships - 单对多

如何使用?

如果你想使用 Core Data 来存储数据的话,就必须得通过 NSManagedObject 这个类。

KVC?

NSManagedObject 类中有一个方法:class func valueForKey(_ key: String!) -> AnyObject!。其实 NSManagedObject 对于 Data Model 中的 attribute 是一无所知的,所以你想要获取其中的 attribute 必须使用一种类似于 Dictionary 的查找方式,这就是 KVC (key-value coding) 。

存储数据

首先如果你的项目需要添加 Core Data 的支持,就是在一开始的时候选中使用 Core Data 这一项。
然后在 xcdatamodeld 文件中添加需要的 entity & attribute

在你需要的地方,保存数据的地方,采用以下几个步骤(都建立在一开始选中 Core Data 的前提下):

  1. 获取 managedObjectContext (可以通过获取 AppDelegate 间接获取),做任何 Core Data 操作之前都要获取上下文
  2. 利用 NSEntityDescription 的类方法 entityForName 获取你需要的 entity description
  3. 通过 NSManagedObjectinit 方法 eneity: insertIntoManagedContext 构造一个 entity 对象
  4. 利用上一步获取的对象,调用 setValue,把你需要保存的东西保存在设备上下文里
  5. 通过第一步获取的 managedObjectContext 调用 save ,保存上下文(也就是写入磁盘)

示例代码(Data Model 中已经有了 Person 的 entity 以及 name attribute):

1
2
3
4
5
6
7
8
9
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")
var error: NSError?
if !managedContext.save(&error) {
println("Save Error!: \(error), \(error?.userInfo)")
}

获取数据

  1. 还是要通过 AppDelegate 获取 managedObjectContext
  2. 构造一个 NSFetchRequest 的请求
  3. 通过 managedObjectContext 执行请求

示例代码:

1
2
3
4
5
6
7
8
9
10
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Person")
var error: NSError?
let fetchedResults = managedContext?.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject]
if let result = fetchedResults {
// 将获取到的结果保存
} else {
println("Error: \(error) , \(error!.userInfo)")
}

至此,简单的 Core Data 操作已经完成,需要存储的数据都会一直保存在磁盘里,即使程序终止或者 iOS 设备重启也不会消失。