close

除了上一篇獲取用戶坐標需要權限外,

存儲資料、行事曆、聯絡人信息等都要用戶授權,

是否需要用到相關授權最好在設計APP的初始階段就決定好,

有需要的可在新增Project時直接勾選Use Core Data,

image

只要選擇了Use Core Data,Swift就會貼心地生成一個數據庫(1),

按下圖的步驟就可以輕鬆地生成一個儲存各項資料的數據庫,

假設現在要生成一個員工的數據庫,

Entities即是數據庫,

而Attributes是數據庫裡面各個元素,例如人名、性別、電話、Email等,

image

除String外,元素還可以設定為整數等各種基本類型,

同時可以設定是否為Optional,

可以避免用戶漏輸入一些重要值的同時,

讓一些無關緊要的值不至於難住用戶,

如果有需要還可以在Validation中對值進行限定,

總不能讓一百萬歲的吸血鬼混進我們的APP吧。

image

在對Core Data有了基本了解後,

是時候要正式運用啦。

數據庫最基礎的使用就是:儲存、讀取、修改、刪除。

現在逐個功能上Code!

 

記得要import CoreData哦~

一、儲存

//MARK: Save

    func saveProfile(name: String, phonenumber:String, email:String, gentle:String) {

        guard let appDelegate=UIApplication.shared.delegate as? AppDelegate else {

            return                              //image取得App Delegate,Guard可確保在AppDelegate為空時可安全退出

 

        }

        

        //1. 在App Delegate中取得Core Data的內容,包括Entities和Attributes

        let managedContext=appDelegate.persistentContainer.viewContext

        let entity=NSEntityDescription.entity(forEntityName: "Profile", in: managedContext)!

        let data=NSManagedObject(entity: entity, insertInto: managedContext)

        

        //2. 將function獲得的值放進數據庫相應的元素中,data.setValue(值, forKey: Attributes)

        data.setValue(name, forKey: "name")

        data.setValue(phonenumber, forKey: "phone")

        data.setValue(email, forKey: "email")

        data.setValue(gentle, forKey: "gentle")

        

        //3. 儲存,如果錯誤會彈出警告

        do{

            try managedContext.save()

        }catch let error as NSError{

            print("Could not save. \(error), \(error.userInfo)")

        }        

    }

二、讀取

//MARK: READ

    func readProfiles() {

        guard let appDelegate=UIApplication.shared.delegate as? AppDelegate else{

            return             //image取得App Delegate,Guard可確保在AppDelegate為空時可安全退出

        }

        

        //1. 在App Delegate中取得Core Data的內容,包括Entities和Attributes

        let managedContext=appDelegate.persistentContainer.viewContext

        let fetchRequest=NSFetchRequest<NSManagedObject>(entityName: "Profile")

        

        //2. print out數據庫所有記錄中的名字,如果錯誤會彈出警告

        do{

            let profiles = try managedContext.fetch(fetchRequest)

            for item in profiles {

                print(item.value(forKey: "name"))

            }

        }catch let error as NSError {

            print("Could not fetch. \(error), \(error.userInfo)")

        }

    }

 

三、修改

其實修改主要是包括兩個部分:尋找與重新儲存,

由於尋找功能也很日常,

所以也另外貼一下:

//MARK: find

    func find(condition con:String){

        guard let appDelegate=UIApplication.shared.delegate as? AppDelegate else {

            return             //image取得App Delegate,Guard可確保在AppDelegate為空時可安全退出

        }

        

        //1. 在App Delegate中取得Core Data的內容,包括Entities和Attributes

        let managedContext=appDelegate.persistentContainer.viewContext

        let fetchRequest=NSFetchRequest<NSManagedObject>(entityName: "Profile")

        //2. 按照條件尋找

        fetchRequest.predicate=NSPredicate(format:"name=%@", con)      //按名字尋找

        //fetchRequest.predicate=NSPredicate(format:"name BEGINSWITH %@", con)  按姓尋找 (以XX開頭的名字)

        

        //3. print out數據庫所有符合要求中的名字,如果錯誤會彈出警告

        do {

            let profile=try managedContext.fetch(fetchRequest)            

            for i in profile{

                print(i.value(forKey: "name"))

            }

        }catch{

            print("Could not find. \(error)")

        }

    }

    //MARK: update

    func update(con_name:String, name:String){

        guard let appDelegate =

          UIApplication.shared.delegate as? AppDelegate else {

          return                 //image取得App Delegate,Guard可確保在AppDelegate為空時可安全退出

        }

 

        //1. 在App Delegate中取得Core Data的內容,包括Entities和Attributes

        let managedContext =

          appDelegate.persistentContainer.viewContext

 

        //2. 按照條件尋找

        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Profile")

        fetchRequest.predicate = NSPredicate(format: "name = %@", con_name)      //按名字尋找

 

        //3. 修改並print out修改後的結果,如果錯誤會彈出警告

        do{

            let test = try managedContext.fetch(fetchRequest)

            let objectUpdate =  test[0]                                                                //如果有多於一條記錄符合結果,將會全部修改

            objectUpdate.setValue(name, forKey: "name")                                     //將新的值放進數據庫相應的元素中,.setValue(新值, forKey: 原值)

 

            do{

                try managedContext.save()                                                         //儲存

                for item in test {                                                                       //print out

                    print(item.value(forKey: "name"))

                    print(item.value(forKey: "gentle"))

                    print(item.value(forKey: "phone"))

                    print(item.value(forKey: "email"))

                }

            }catch{

                print(error)

            }

        }catch{

            print(error)

        }

    }

四、刪除

而刪除通常都會包括:尋找與刪除、全部刪除兩種,

尋找與刪除的寫法請結合樓上啦~

 //MARK: Delete

    func deleteAll() {

        guard let appDelegate =

          UIApplication.shared.delegate as? AppDelegate else {

          return                            //image取得App Delegate,Guard可確保在AppDelegate為空時可安全退出

        }

 

        //1. 在App Delegate中取得Core Data的內容,包括Entities和Attributes

        let managedContext = appDelegate.persistentContainer.viewContext

        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Profile")

 

        //2. 將數據庫所有記錄逐一刪除,如果錯誤會彈出警告

        if let result = try? managedContext.fetch(fetchRequest) {

            for object in result {

                managedContext.delete(object)

            }

            do{

                try managedContext.save()                                                        //儲存

            }catch{

                print(error)

            }

        }

調用

上面的Code都是如同MVC中的Model,

就是單純的功能,

需要在Control中調用,

在哪裡調用要視乎APP是如何設計的,

這裡簡單列出調用以上功能的Code作例子,

saveProfile(name: "Ann", phonenumber: "88888888", email: "123@gmail.com", gentle: "F")     

                                                 //新記錄並儲存

readProfiles()                                                       //讀取

find(condition: "Fion")                                           //尋找名為Fion的記錄(find這個名字改得不夠清晰,變相要讀Code才能知道條件用在哪,記得不要犯和某君一樣的錯誤哦

update(con_name: "Fion", name: "Ann")                  //尋找名為Fion的記錄並將所有Fion改為Ann

deleteAll()                                                          //刪除所有記錄

 

記性不好或者與他人共同創作的親也不用害怕先後順序,

Swift會提醒你的 (如果寫Code時沒有寫的話就另當別論了⋯⋯)

image

 

另外,Core Data除了作為真正的數據庫外,

還可以儲存用戶的一定簡單設定,

例如APP語言設定。

arrow
arrow

    4ngus 發表在 痞客邦 留言(0) 人氣()