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)") } } }