1、介紹數據庫
CoreData不像slqite3那樣編寫代碼繁瑣,同時避免了使用了SQL語句的麻煩,也能夠迴避使用C語言的語法,下降了iOS開發的技術門檻。swift
CoreData可下降開發成本,提升代碼質量。它是一個徹底面向對象的API,可以合理管理內存,負責在數據庫中存儲數據,底層也是由相似app
於SQL的技術實現的。CoreData是持久化存儲的最佳方式,數據最終的存儲類型能夠是SQLite數據庫、XML、二進制、內存或自定義數據類型ide
它和SQLite的區別是:只能取出整個實體記錄,而後分離,以後才能獲得實體的某個屬性。工具
2、注意fetch
Swift3.0中CoreData使用有了很大的變更,以下:spa
一、生成的AppDelegate類中關於CoreData的代碼更少了code
二、建立Entity實體後,再建立對應的類,找不到NSManageredObject這個文件,解決辦法以下操做orm
(1)建立實體,添加屬性對象
(2)建立對相應的類,只有Data Model和Mapping Model,卻找不到NSManageedObject
(3)從工具欄Editor建立NSManagedObject
三、建立出的對應得實體類是分類
3、好了,建立完畢後,如今開始進行CoreData的操做了,這裏我建立了工具類HandleCoreData,專門用來操做CoreData的,提供類方法。
(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)") } }
操做CoreData完整的代碼以下:
// // HandleCoreData.swift // XYQCoreData // // Created by 夏遠全 on 2017/2/25. // Copyright © 2017年 夏遠全. All rights reserved. // import UIKit import CoreData //User對象建立成功以後,接下來就是經過對象來使用CoreData了 class HandleCoreData: NSObject { //一、插入數據的具體操做以下 /* * 經過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() } //二、查詢數據的具體操做以下 /* * 利用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)") } } //三、修改數據的具體操做以下 /* * 利用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)") } } //四、刪除數據的具體操做以下 /* * 利用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)") } } }