一、介紹
CoreData不像slqite3那樣編寫代碼繁瑣,同時避免了使用了SQL語句的麻煩,也可以回避使用C語言的語法,降低了iOS開發的技術門檻。
CoreData可降低開發成本,提高代碼質量。它是一個完全面向對象的API,能夠合理管理內存,負責在數據庫中存儲數據,底層也是由類似
於SQL的技術實現的。CoreData是持久化存儲的最佳方式,數據最終的存儲類型可以是SQLite數據庫、XML、二進制、內存或自定義數據類型
它和SQLite的區別是:只能取出整個實體記錄,然后分離,之后才能得到實體的某個屬性。
二、注意
Swift3.0中CoreData使用有了很大的變動,如下:
1、生成的AppDelegate類中關於CoreData的代碼更少了
2、創建Entity實體后,再創建對應的類,找不到NSManageredObject這個文件,解決辦法如下操作
(1)創建實體,添加屬性
(2)創建對相應的類,只有Data Model和Mapping Model,卻找不到NSManageedObject
(3)從工具欄Editor創建NSManagedObject
3、創建出的對應得實體類是分類
三、好了,創建完畢后,現在開始進行CoreData的操作了,這里我創建了工具類HandleCoreData,專門用來操作CoreData的,提供類方法。
(1)插入數據
//1、插入數據的具體操作如下 /* * 通過AppDelegate單利來獲取管理的數據上下文對象,操作實際內容 * 通過NSEntityDescription.insertNewObjectForEntityForName方法創建實體對象 * 給實體對象賦值 * 通過saveContext()保存實體對象 */ class func insertData(){ //獲取數據上下文對象 let app = UIApplication.shared.delegate as! AppDelegate let context = app.persistentContainer.viewContext //創建user對象 let EntityName = "User" let oneUser = NSEntityDescription.insertNewObject(forEntityName: EntityName, into:context) as! User //對象賦值 oneUser.userID = 2 oneUser.userEmail = "12345@163.com" oneUser.userPwd = "123456" //保存 app.saveContext() }
(2)查詢數據
//2、查詢數據的具體操作如下 /* * 利用NSFetchRequest方法來聲明數據的請求,相當於查詢語句 * 利用NSEntityDescription.entityForName方法聲明一個實體結構,相當於表格結構 * 利用NSPredicate創建一個查詢條件,並設置請求的查詢條件 * 通過context.fetch執行查詢操作 * 使用查詢出來的數據 */ class func queryData(){ //獲取數據上下文對象 let app = UIApplication.shared.delegate as! AppDelegate let context = app.persistentContainer.viewContext //聲明數據的請求 let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest() fetchRequest.fetchLimit = 10 //限制查詢結果的數量 fetchRequest.fetchOffset = 0 //查詢的偏移量 //聲明一個實體結構 let EntityName = "User" let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context) fetchRequest.entity = entity //設置查詢條件 let predicate = NSPredicate.init(format: "userID = '2'", "") fetchRequest.predicate = predicate //查詢操作 do{ let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍歷查詢的結果 for info:User in fetchedObjects{ print("userID = \(info.userID)") print("userEmail = \(info.userEmail)") print("userPwd = \(info.userPwd)") print("+++++++++++++++++++++++++") } }catch { let nserror = error as NSError fatalError("查詢錯誤: \(nserror), \(nserror.userInfo)") } }
(3)修改數據
//3、修改數據的具體操作如下 /* * 利用NSFetchRequest方法來聲明數據的請求,相當於查詢語句 * 利用NSEntityDescription.entityForName方法聲明一個實體結構,相當於表格結構 * 利用NSPredicate創建一個查詢條件,並設置請求的查詢條件 * 通過context.fetch執行查詢操作 * 將查詢出來的數據進行修改,也即進行賦新值 * 通過saveContext()保存修改后的實體對象 */ class func updateData(){ //獲取數據上下文對象 let app = UIApplication.shared.delegate as! AppDelegate let context = app.persistentContainer.viewContext //聲明數據的請求 let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest() fetchRequest.fetchLimit = 10 //限制查詢結果的數量 fetchRequest.fetchOffset = 0 //查詢的偏移量 //聲明一個實體結構 let EntityName = "User" let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context) fetchRequest.entity = entity //設置查詢條件 let predicate = NSPredicate.init(format: "userID = '2'", "") fetchRequest.predicate = predicate //查詢操作 do{ let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍歷查詢的結果 for info:User in fetchedObjects{ //修改郵箱 info.userEmail = "xyq@163.com" //重新保存 app.saveContext() } }catch { let nserror = error as NSError fatalError("查詢錯誤: \(nserror), \(nserror.userInfo)") } }
(4)刪除數據
//4、刪除數據的具體操作如下 /* * 利用NSFetchRequest方法來聲明數據的請求,相當於查詢語句 * 利用NSEntityDescription.entityForName方法聲明一個實體結構,相當於表格結構 * 利用NSPredicate創建一個查詢條件,並設置請求的查詢條件 * 通過context.fetch執行查詢操作 * 通過context.delete刪除查詢出來的某一個對象 * 通過saveContext()保存修改后的實體對象 */ class func deleteData(){ //獲取數據上下文對象 let app = UIApplication.shared.delegate as! AppDelegate let context = app.persistentContainer.viewContext //聲明數據的請求 let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest() fetchRequest.fetchLimit = 10 //限制查詢結果的數量 fetchRequest.fetchOffset = 0 //查詢的偏移量 //聲明一個實體結構 let EntityName = "User" let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context) fetchRequest.entity = entity //設置查詢條件 let predicate = NSPredicate.init(format: "userID = '2'", "") fetchRequest.predicate = predicate //查詢操作 do{ let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍歷查詢的結果 for info:User in fetchedObjects{ //刪除對象 context.delete(info) //重新保存 app.saveContext() } }catch { let nserror = error as NSError fatalError("查詢錯誤: \(nserror), \(nserror.userInfo)") } }
操作CoreData完整的代碼如下:

// // HandleCoreData.swift // XYQCoreData // // Created by 夏遠全 on 2017/2/25. // Copyright © 2017年 夏遠全. All rights reserved. // import UIKit import CoreData //User對象創建成功之后,接下來就是通過對象來使用CoreData了 class HandleCoreData: NSObject { //1、插入數據的具體操作如下 /* * 通過AppDelegate單利來獲取管理的數據上下文對象,操作實際內容 * 通過NSEntityDescription.insertNewObjectForEntityForName方法創建實體對象 * 給實體對象賦值 * 通過saveContext()保存實體對象 */ class func insertData(){ //獲取數據上下文對象 let app = UIApplication.shared.delegate as! AppDelegate let context = app.persistentContainer.viewContext //創建user對象 let EntityName = "User" let oneUser = NSEntityDescription.insertNewObject(forEntityName: EntityName, into:context) as! User //對象賦值 oneUser.userID = 2 oneUser.userEmail = "12345@163.com" oneUser.userPwd = "123456" //保存 app.saveContext() } //2、查詢數據的具體操作如下 /* * 利用NSFetchRequest方法來聲明數據的請求,相當於查詢語句 * 利用NSEntityDescription.entityForName方法聲明一個實體結構,相當於表格結構 * 利用NSPredicate創建一個查詢條件,並設置請求的查詢條件 * 通過context.fetch執行查詢操作 * 使用查詢出來的數據 */ class func queryData(){ //獲取數據上下文對象 let app = UIApplication.shared.delegate as! AppDelegate let context = app.persistentContainer.viewContext //聲明數據的請求 let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest() fetchRequest.fetchLimit = 10 //限制查詢結果的數量 fetchRequest.fetchOffset = 0 //查詢的偏移量 //聲明一個實體結構 let EntityName = "User" let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context) fetchRequest.entity = entity //設置查詢條件 let predicate = NSPredicate.init(format: "userID = '2'", "") fetchRequest.predicate = predicate //查詢操作 do{ let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍歷查詢的結果 for info:User in fetchedObjects{ print("userID = \(info.userID)") print("userEmail = \(info.userEmail)") print("userPwd = \(info.userPwd)") print("+++++++++++++++++++++++++") } }catch { let nserror = error as NSError fatalError("查詢錯誤: \(nserror), \(nserror.userInfo)") } } //3、修改數據的具體操作如下 /* * 利用NSFetchRequest方法來聲明數據的請求,相當於查詢語句 * 利用NSEntityDescription.entityForName方法聲明一個實體結構,相當於表格結構 * 利用NSPredicate創建一個查詢條件,並設置請求的查詢條件 * 通過context.fetch執行查詢操作 * 將查詢出來的數據進行修改,也即進行賦新值 * 通過saveContext()保存修改后的實體對象 */ class func updateData(){ //獲取數據上下文對象 let app = UIApplication.shared.delegate as! AppDelegate let context = app.persistentContainer.viewContext //聲明數據的請求 let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest() fetchRequest.fetchLimit = 10 //限制查詢結果的數量 fetchRequest.fetchOffset = 0 //查詢的偏移量 //聲明一個實體結構 let EntityName = "User" let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context) fetchRequest.entity = entity //設置查詢條件 let predicate = NSPredicate.init(format: "userID = '2'", "") fetchRequest.predicate = predicate //查詢操作 do{ let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍歷查詢的結果 for info:User in fetchedObjects{ //修改郵箱 info.userEmail = "xyq@163.com" //重新保存 app.saveContext() } }catch { let nserror = error as NSError fatalError("查詢錯誤: \(nserror), \(nserror.userInfo)") } } //4、刪除數據的具體操作如下 /* * 利用NSFetchRequest方法來聲明數據的請求,相當於查詢語句 * 利用NSEntityDescription.entityForName方法聲明一個實體結構,相當於表格結構 * 利用NSPredicate創建一個查詢條件,並設置請求的查詢條件 * 通過context.fetch執行查詢操作 * 通過context.delete刪除查詢出來的某一個對象 * 通過saveContext()保存修改后的實體對象 */ class func deleteData(){ //獲取數據上下文對象 let app = UIApplication.shared.delegate as! AppDelegate let context = app.persistentContainer.viewContext //聲明數據的請求 let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest() fetchRequest.fetchLimit = 10 //限制查詢結果的數量 fetchRequest.fetchOffset = 0 //查詢的偏移量 //聲明一個實體結構 let EntityName = "User" let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context) fetchRequest.entity = entity //設置查詢條件 let predicate = NSPredicate.init(format: "userID = '2'", "") fetchRequest.predicate = predicate //查詢操作 do{ let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍歷查詢的結果 for info:User in fetchedObjects{ //刪除對象 context.delete(info) //重新保存 app.saveContext() } }catch { let nserror = error as NSError fatalError("查詢錯誤: \(nserror), \(nserror.userInfo)") } } }