swift3.0:CoreData的使用

Posted 程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift3.0:CoreData的使用相关的知识,希望对你有一定的参考价值。

一、介绍

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

 

以上是关于swift3.0:CoreData的使用的主要内容,如果未能解决你的问题,请参考以下文章

浅谈SwiftUI 3.0新加入的CoreData动态FetchRequest过滤与排序特性

使用 Swift 3.0 将 CoreData 保存到 Web 服务器

以一个名称将多个对象保存到 coredata

如何以一个名称将多个对象保存到 CoreData

Swift 3.0 - 核心数据 / 意外发现 nil

Swift 3“任何”类型的值没有成员“valueForKey”