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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM