一、介绍
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 = "[email protected]" 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 = "[email protected]" //重新保存 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 = "[email protected]" 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 = "[email protected]" //重新保存 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)") } } }