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 的前提下):
- 获取
managedObjectContext(可以通过获取AppDelegate间接获取),做任何 Core Data 操作之前都要获取上下文
- 利用
NSEntityDescription的类方法entityForName获取你需要的entity description
- 通过
NSManagedObject的init方法eneity: insertIntoManagedContext构造一个entity对象
- 利用上一步获取的对象,调用
setValue,把你需要保存的东西保存在设备上下文里
- 通过第一步获取的
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)")
}获取数据
- 还是要通过
AppDelegate获取managedObjectContext
- 构造一个
NSFetchRequest的请求
- 通过
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 设备重启也不会消失。