一,Core Data介紹
① Core Data是iOS5之后才出現(xiàn)的一個(gè)數(shù)據(jù)持久化存儲(chǔ)框架,它提供了對(duì)象-關(guān)系映射(ORM)的功能,即能夠?qū)?duì)象轉(zhuǎn)化成數(shù)據(jù),也能夠?qū)⒈4嬖跀?shù)據(jù)庫(kù)中的數(shù)據(jù)還原成對(duì)象。
② 雖然其底層也是由類(lèi)似于SQL的技術(shù)來(lái)實(shí)現(xiàn),但我們不需要編寫(xiě)任何SQL語(yǔ)句,有點(diǎn)像Java開(kāi)發(fā)中的Hibernate持久化框架
③ Core Data數(shù)據(jù)最終的存儲(chǔ)類(lèi)型可以是:SQLite數(shù)據(jù)庫(kù),XML,二進(jìn)制,內(nèi)存里,或自定義數(shù)據(jù)類(lèi)型。
④ 與SQLite區(qū)別:只能取出整個(gè)實(shí)體記錄,然后分解,之后才能得到實(shí)體的某個(gè)屬性。
二,Core Data的使用準(zhǔn)備 - 數(shù)據(jù)模型和實(shí)體類(lèi)的創(chuàng)建
① 創(chuàng)建項(xiàng)目的時(shí)候,勾選“Use Core Data”。完畢后在AppDelegate 中,會(huì)生成相關(guān)代碼。

② 打開(kāi)項(xiàng)目中的 xcdatamodeld
** 文件,在右邊的數(shù)據(jù)模型編輯器的底部工具欄點(diǎn)擊 Add Entity
** 添加實(shí)體,實(shí)體名稱(chēng)設(shè)置為"User"。
同時(shí)在屬性欄中對(duì)實(shí)體命名進(jìn)行修改,并在 Attribute
** 欄目中添加 id
,username
,password
** 三個(gè)屬性

③ 點(diǎn)擊上圖中Editor Style 可以查看實(shí)體的關(guān)系圖,如下圖

④ 要為每一個(gè)實(shí)體生成一個(gè)對(duì)應(yīng)的 創(chuàng)建NSManagedObject 子類(lèi),通過(guò)類(lèi)的成員屬性來(lái)訪問(wèn)和獲取數(shù)據(jù)。選中.xcdatamodeld文件,點(diǎn)擊Editor里面的Create NSManagerObject SubClass創(chuàng)建類(lèi),如下圖:

⑤ 創(chuàng)建完成后,項(xiàng)目中會(huì)多出** User+CoreDataProperties.swift和User.Swift**文件
三 Core Data的使用
首先創(chuàng)建一個(gè)CoredData的工具類(lèi),用來(lái)操作CoreData,并導(dǎo)入import CoreData
① 插入數(shù)據(jù),并保存
// MARK:- 插入(保存)數(shù)據(jù)操作
internal func insetData(){
// 獲取管理的數(shù)據(jù)上下文 對(duì)象
let app = UIApplication.sharedApplication().delegate as! AppDelegate
let context = app.managedObjectContext
// 創(chuàng)建User對(duì)象
/**
insertNewObjectForEntityForName 里面
<#T##entityName: String##String#> 實(shí)體名稱(chēng)
<#T##NSManagedObjectContext#> 上下文
*/
let user = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context) as! User
// 對(duì)象賦值
user.id = 1
user.username = "RookieYX"
user.password = "1234"
// 保存
do{
try context.save()
print("保存成功")
}
catch{
fatalError("無(wú)法保存 \\\\(error)")
}
}
② 查詢(xún)數(shù)據(jù)操作
// MARK:- 查詢(xún)數(shù)據(jù)操作
internal func searchData(){
// 獲取管理的數(shù)據(jù)上下文 對(duì)象
let app = UIApplication.sharedApplication().delegate as! AppDelegate
let context = app.managedObjectContext
// 聲明數(shù)據(jù)的請(qǐng)求
let fetchRequest:NSFetchRequest = NSFetchRequest()
fetchRequest.fetchLimit = 10 // 限定查詢(xún)結(jié)果的數(shù)量
fetchRequest.fetchOffset = 0 // 查詢(xún)的偏移量
// 聲明一個(gè)實(shí)體結(jié)構(gòu)
let entity:NSEntityDescription? = NSEntityDescription.entityForName("User", inManagedObjectContext: context)
// 設(shè)置數(shù)據(jù)請(qǐng)求的實(shí)體結(jié)構(gòu)
fetchRequest.entity = entity
// 設(shè)置查詢(xún)條件
let predicate = NSPredicate(format: "id = '1'", "")
fetchRequest.predicate = predicate
// 查詢(xún)操作
do{
let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)
// 遍歷查詢(xún)的結(jié)果
for info:User in fetchedObjects as! [User] {
print("id=\\\\(info.id)")
print("username=\\\\(info.username)")
print("password=\\\\(info.password)")
}
}
catch {
fatalError("不能保存:\\\\(error)")
}
}
③ 修改數(shù)據(jù)操作
internal func updateData(){
// 獲取管理的數(shù)據(jù)上下文 對(duì)象
let app = UIApplication.sharedApplication().delegate as! AppDelegate
let context = app.managedObjectContext
// 聲明數(shù)據(jù)的請(qǐng)求
let fetchRequest:NSFetchRequest = NSFetchRequest()
fetchRequest.fetchLimit = 10 // 限定查詢(xún)結(jié)果的數(shù)量
fetchRequest.fetchOffset = 0 // 查詢(xún)的偏移量
// 聲明一個(gè)實(shí)體結(jié)構(gòu)
let entity:NSEntityDescription? = NSEntityDescription.entityForName("User", inManagedObjectContext: context)
// 設(shè)置數(shù)據(jù)請(qǐng)求的實(shí)體結(jié)構(gòu)
fetchRequest.entity = entity
// 設(shè)置查詢(xún)條件
let predicate = NSPredicate(format: "id = '1'", "")
fetchRequest.predicate = predicate
// 查詢(xún)操作
do{
let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)
// 遍歷查詢(xún)的結(jié)果
for info:User in fetchedObjects as! [User] {
//修改密碼
info.password = "abcd"
//重新保存
try context.save()
}
}
catch {
fatalError("不能保存:\\\\(error)")
}
}
④ 刪除數(shù)據(jù)操作
// MARK:- 刪除數(shù)據(jù)操作
internal func delecteData(){
// 獲取管理的數(shù)據(jù)上下文 對(duì)象
let app = UIApplication.sharedApplication().delegate as! AppDelegate
let context = app.managedObjectContext
// 聲明數(shù)據(jù)的請(qǐng)求
let fetchRequest:NSFetchRequest = NSFetchRequest()
fetchRequest.fetchLimit = 10 // 限定查詢(xún)結(jié)果的數(shù)量
fetchRequest.fetchOffset = 0 // 查詢(xún)的偏移量
// 聲明一個(gè)實(shí)體結(jié)構(gòu)
let entity:NSEntityDescription? = NSEntityDescription.entityForName("User", inManagedObjectContext: context)
// 設(shè)置數(shù)據(jù)請(qǐng)求的實(shí)體結(jié)構(gòu)
fetchRequest.entity = entity
// 設(shè)置查詢(xún)條件
let predicate = NSPredicate(format: "id = '1'", "")
fetchRequest.predicate = predicate
// 查詢(xún)操作
do{
let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)
// 遍歷查詢(xún)的結(jié)果
for info:User in fetchedObjects as! [User] {
//刪除對(duì)象
context.deleteObject(info)
}
// 重新保存 - 更新到數(shù)據(jù)庫(kù)中
try context.save()
}
catch {
fatalError("不能保存:\\\\(error)")
}
}
** 四 在ViewController中使用我們的CoreData工具類(lèi)**
let tool = CoreDataTool()
// 插入數(shù)據(jù)
tool.insetData()
// 查詢(xún)
tool.searchData()
// 更新修改
tool.updateData()
// 刪除
tool.delecteData()
學(xué)習(xí)NSUserDefaults/ NSKeyedArchiver/ write儲(chǔ)存,可以看之前的文章
之后將持續(xù)更新CoreData的深入學(xué)習(xí)知識(shí),想要學(xué)習(xí)的同學(xué)可以繼續(xù)關(guān)注