Swift 3.0:初識(shí)Core Data

前言

最近開發(fā)的項(xiàng)目遇到了數(shù)據(jù)持久化的需求,由于對(duì)原生有著特殊偏愛的癖好,首先想了解的便是Core Data,遂就此整理了一下近期所學(xué)(基礎(chǔ)部分還請(qǐng)自行谷歌),希望可以幫到Core Data的初用者,不足之處還請(qǐng)各路大神多多指點(diǎn)。

Core Data簡(jiǎn)介

Core Date是ios3.0后引入的數(shù)據(jù)持久化解決方案,它是是蘋果官方推薦使用的,不需要借助第三方框架。Core Date實(shí)際上是對(duì)SQLite的封裝,提供了更高級(jí)的持久化方式。在對(duì)數(shù)據(jù)庫操作時(shí),不需要使用sql語句,也就意味著即使不懂sql語句,也可以操作數(shù)據(jù)庫中的數(shù)據(jù)。在iOS10之后,Core Data也是有了不少改進(jìn)。

一、準(zhǔn)備工作

1、創(chuàng)建工程,使用Core Data

新建工程,使用CoreData

2、創(chuàng)建一個(gè)Entity,新增一個(gè)Person,后面會(huì)使用

新增一個(gè)Person

二、Core Data基本使用

首先:import CoreData

1、獲取NSManagerContext

    func getObjectContext() -> NSManagedObjectContext {
        let delegate = UIApplication.shared.delegate as! AppDelegate
        let context = delegate.persistentContainer.viewContext
        return context
    }

2、增刪改查基本使用

  • 增加數(shù)據(jù)
func insertData(name: String, age: String) {
        //取得上下文
        let context = getObjectContext()
        //獲取之前創(chuàng)建的Person實(shí)體
        let entity = NSEntityDescription.entity(forEntityName: "Person", in: context)
        //獲取托管的person對(duì)象
        let person = NSManagedObject(entity: entity!, insertInto: context)
        //給person添加姓名、年齡
        person.setValue(name, forKey: "name")
        person.setValue(age, forKey: "age")
        //執(zhí)行存儲(chǔ)
        do {
            try context.save()
            //成功
        } catch {
            print(error)
            //失敗
        }
    }
  • 刪除數(shù)據(jù)
func removeData(name: String, age: String) {
        let context = getObjectContext()
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")
        //設(shè)置查找條件
        let condition = "name='\(name)'OR age='\(age)'"
        let predicate = NSPredicate(format: condition, "")
        fetchRequest.predicate = predicate
        do {
            let fetchResults = try context.fetch(fetchRequest)
            guard fetchResults.count > 0 else {
                print("未找到數(shù)據(jù)")
                return
            }
            for result in fetchResults as! [NSManagedObject] {
                context.delete(result)
            }
            //刪除之后不要忘記save
            try context.save()
            print("刪除成功")
        } catch {
            print(error)
            //失敗
        }

這里的condition設(shè)置了匹配名字或年齡的條件"name='\(name)'OR age='\(age)'"

其他的條件用法:

判斷字符串首字母是否為字母

let condition = "SELF MATCHES %@", "^[A-Za-z].+" 

比較運(yùn)算符>,<,==,>=,<=,!=,可用于數(shù)值及字符串

let condition = "number > 100"

范圍運(yùn)算符:IN、BETWEEN

let condition = "number BETWEEN {1,5}"`
let condition = "address IN {'shanghai','beijing'}"`

字符串本身:SELF

let condition = "SELF == 'APPLE'"

字符串相關(guān):BEGINSWITH、ENDSWITH、CONTAINS

//包含某個(gè)字符串
let condition = "content CONTAINS[cd] 'ang'"  
//以某個(gè)字符串開頭   
let condition = "content BEGINSWITH[c] 'sh'"    
//以某個(gè)字符串結(jié)束
let condition = "content ENDSWITH[d] 'ang'"

注:[c]不區(qū)分大小寫[d]不區(qū)分發(fā)音符號(hào)即沒有重音符號(hào)[cd]既不區(qū)分大小寫,也不區(qū)分發(fā)音符號(hào)。
通配符:LIKE

//代表通配符
let condition = "content LIKE[cd] 'er'" 
let condition = "content LIKE[cd] '???er'"

正則表達(dá)式:MATCHES

//以A開頭,e結(jié)尾
let regex = "^A.+e$"              
let condition =  "name MATCHES %@",regex
  • 改數(shù)據(jù)
func updateData(name: String) {
        let context = getObjectContext()
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")
        let condition = "name='\(name)'"
        let predicate = NSPredicate(format: condition, "")
        fetchRequest.predicate = predicate
        do {
            let fetchResults = try context.fetch(fetchRequest)
            guard fetchResults.count > 0 else {
                print("未找到數(shù)據(jù)")
                return
            }
            for result in fetchResults as! [NSManagedObject] {
                result.setValue("Developer", forKey: "name")
            }
            try context.save()
            print("修改成功")
        } catch {
            print(error)
        }
    }

此處示例,是通過匹配name后批量修改為"Developer",程序內(nèi)寫死了,只為演示,至于實(shí)際中按需求發(fā)揮O(∩_∩)O哈哈~

  • 查詢數(shù)據(jù)
func queryData() {
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person")
            //此處未設(shè)置查詢條件,默認(rèn)取所有數(shù)據(jù)
        do {
            let context = getObjectContext()
            let fetchResults = try context.fetch(fetchRequest)
            for result in fetchResults {
                let name = result.value(forKey: "name")!
                let age = result.value(forKey: "age")!
                print("name: \(name), age: \(age)")
            }
            //成功
        } catch {
            print(error)
            //失敗
        }
    }

本章Demo下載
以上是本人的一些簡(jiǎn)單總結(jié),也是剛學(xué),不對(duì)之處還請(qǐng)各位看客多多留言指正,再此謝過!后續(xù)有時(shí)間會(huì)繼續(xù)更新...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容