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 设备重启也不会消失。