Learn CoreData

什么是 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 操作之前都要获取上下文
  1. 利用 NSEntityDescription 的类方法 entityForName 获取你需要的 entity description
  1. 通过 NSManagedObjectinit 方法 eneity: insertIntoManagedContext 构造一个 entity 对象
  1. 利用上一步获取的对象,调用 setValue,把你需要保存的东西保存在设备上下文里
  1. 通过第一步获取的 managedObjectContext 调用 save ,保存上下文(也就是写入磁盘)
示例代码(Data Model 中已经有了 Person 的 entity 以及 name attribute):
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
  1. 构造一个 NSFetchRequest 的请求
  1. 通过 managedObjectContext 执行请求
示例代码:
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 设备重启也不会消失。

© Xinyu 2014 - 2024