Swift 資料庫 Core Data CRUD 方式

Anny
8 min readNov 18, 2020

--

Core Data 儲存資料的框架,底層操作一樣是 SQLite ,但簡化了資料庫的處理,不需看懂複雜的SQL語法,不用了解 SQL 指令也可以快速的建立還有使用資料庫。

其他 iOS 會用的資料庫 包含了~~~SQLite 、 CoreData 、Realm

本文章內容包含:

  • 在專案中加入Core Data
  • 設定 Entity 與 Attribute
  • Core Data 新增、查詢、更新、刪除資料

在專案中加入Core Data

建立專案的時候,記得將 Use Core Data 打勾,如下圖:

一開始忘記勾選也沒關係~~~
可以透過新增 File 來增加 : New File 的 Core Data 裡面,新增 Data Model。

設定 Entity 與 Attribute

建立好專案後,檔案列表中有一個.xcdatamodeld的檔案。
這是用來設定 Entity 與 Attribute 的檔案。

設定步驟~~~ 設定結果如下圖:

  1. Add Entity 新增一個新的資料庫表格table
  2. 幫這個 Entity 命名 (範例為製作使用者資料,因此命名為User)
  3. Add Attribute 新增資料欄位
  4. 增加兩個 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連接:

--

--

Anny
Anny

Written by Anny

If You Think You Can, You Can!

No responses yet