在專案中加入Core Data
建立專案的時候,記得將 Use Core Data 打勾,如下圖:
一開始忘記勾選也沒關係~~~
可以透過新增 File 來增加 : New File 的 Core Data 裡面,新增 Data Model。
設定 Entity 與 Attribute
建立好專案後,檔案列表中有一個.xcdatamodeld
的檔案。
這是用來設定 Entity 與 Attribute 的檔案。
設定步驟~~~ 設定結果如下圖:
- Add Entity 新增一個新的資料庫表格table
- 幫這個 Entity 命名 (範例為製作使用者資料,因此命名為User)
- Add Attribute 新增資料欄位
- 增加兩個 Attribute :name, phone ,Type 也就是每一個 Attribute 的類型,兩者均為 String。
這樣就完成加入 Core Data 的步驟了喔!!!
接下來就來看 Core Data 如何新增、查詢、修改、刪除資料吧~~~CRUD
使用 Core Data
建立好資料庫屬性及型別後,就要來存入資料了。
先 import CoreData
如果你查看 AppDelegate.swift 就會發現在我們一開始創建專案,並將CoreData加入,則會新增以下程式碼。
// 用來操作 Core Data 的常數let container = (UIApplication.shared.delegate as! AppDelegate).persistentContainerlet context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
所以上述程式是以委任的方式,取得 AppDelegate.swift 的屬性,來操作 Core Data 。
此時的 container 型態為NSPersistentContainer
而context 型態為NSManagedObjectContext
Core Data 新增、查詢、更新、刪除資料
接著用簡單的範例來說明 Core Data CRUD 的方式吧~~~
輸入使用者姓名與手機,按下送出則將使用者訊息存進資料庫中。
先來創建送出按鈕的執行Action吧
先判斷輸入的姓名與手機欄位是否為空,若兩者皆不為空,則呼叫新增資料的function,也就是addUser。
Core Data 新增資料
將我們創建的資料庫名為 User 的實體,指派給常數 user,並帶入剛剛型態為NSManagedObjectContext 的 context。
只要需要存入資料或進行其他資料庫的操作,都需要用到建立好的資料庫。 也就是 User(context: NSManagedObjectContext)
我們就會拿到NSPersistentContainer中的viewContext部分。
接下來就可以在 user 各個 attribute 設定將取得的UITextField資料存入。
存完之後要將資料庫存檔,在做完任何操作都需要存檔案,viewContext
有新的變化時,就要進行viewContext.save() 他是一個throwing function。
在進行資料庫操作都需要執行do try catch。
在 AppDelegate.swift 新增延伸的.saveContext()程式碼,這樣之後需要使用時就可以直接呼叫,container.saveContext()。
Core Data 查詢資料
查詢則會使用到 NSFetchRequest
設定常數 request = NSFetchRequest<User>(entityName: “User”)
此時的 request 型態為 NSFetchRequest<User> 抓取 User 資料庫的請求。
在進行資料庫操作時,都需要執行do try catch。
context.fetch(request) 進入資料庫抓資料,接著將裡面的各個資料印出來。
for result in results {
print(“姓名: \(result.name!), 手機: \(result.phone!)”)
}
Core Data 修改資料
跟剛剛一樣,設定 request = NSFetchRequest<User>(entityName: “User”)
此時的 request 型態為 NSFetchRequest<User> 抓取 User 資料庫的請求。
接著給出你要修改的項目條件,在這裡我要修改使用者名字為anny的手機。
先將使用者anny 名字存入 等等要做比對。
比對時我們會使用,predicate 後面會給他格式,也就是你要比對的項目。
有兩種方式都可以比對 :
request.predicate = NSPredicate(format: “name == %@”, name)
request.predicate = NSPredicate(format: “name CONTAINS[cd]%@”, name)
如果今天資料庫中有 唯一的 id 時,format 可以直接寫成 "id = \(updateID)"
就不需要字串的比對了。
request.predicate = NSPredicate(format: "id = \(updateID)")
Core Data 刪除資料
刪除的方法也跟上面一樣,
先設定 request = NSFetchRequest<User>(entityName: “User”)
然後設定要刪除的項目,predicate 後面會給他你要刪除的項目格式。
然後使用 context.delete(result) 刪除該項目。
如果你今天是要清空整個資料庫的內容,就不用 predicate 直接for迴圈。
func cleanUser(){
let request = NSFetchRequest<User>(entityName: "User")
do {
let results = try context.fetch(request)
for result in results {
context.delete(result)
}
} catch {
fatalError("Could not fetch. \(error)")
}
}
最後呈現一下所有資料庫進行操作的結果!!!
今天就這樣結束囉~~~
一樣附上Github連接: