除了上一篇獲取用戶坐標需要權限外,
存儲資料、行事曆、聯絡人信息等都要用戶授權,
是否需要用到相關授權最好在設計APP的初始階段就決定好,
有需要的可在新增Project時直接勾選Use Core Data,
只要選擇了Use Core Data,Swift就會貼心地生成一個數據庫(1),
按下圖的步驟就可以輕鬆地生成一個儲存各項資料的數據庫,
假設現在要生成一個員工的數據庫,
Entities即是數據庫,
而Attributes是數據庫裡面各個元素,例如人名、性別、電話、Email等,
除String外,元素還可以設定為整數等各種基本類型,
同時可以設定是否為Optional,
可以避免用戶漏輸入一些重要值的同時,
讓一些無關緊要的值不至於難住用戶,
如果有需要還可以在Validation中對值進行限定,
總不能讓一百萬歲的吸血鬼混進我們的APP吧。
在對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 //取得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 //取得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 //取得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 //取得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 //取得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時沒有寫的話就另當別論了⋯⋯)
另外,Core Data除了作為真正的數據庫外,
還可以儲存用戶的一定簡單設定,
例如APP語言設定。
留言列表