zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Day3----《Pattern Recognition and Machine Learning》Christopher M. Bishop
    Day2----《Pattern Recognition and Machine Learning》Christopher M. Bishop
    学习笔记-----《Pattern Recognition and Machine Learning》Christopher M. Bishop
    “数学之美”笔记
    win10下使用nodejs安装及webstorm创建express项目的指导
    deepin/ubuntu下搭建Jekyll环境
    struts2.3.23升级到struts2.3.32
    struts2.5能不能再恶心点
    线程通信、线程同步以及进城通信的真的搞懂了么
    WINFORM数据库操作,有点像安装里面的SQLITE
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/6441426.html
Copyright © 2011-2022 走看看