“`html

全面學習 Swift 中的數據庫編程:SQLite、CoreData 與 FMDB 的最新實作指南

Swift 是一種強大且現代的程式語言,廣泛用於開發 iOS 和 macOS 應用程序。在這篇文章中,我們將深入探討在 Swift 中進行數據庫編程的方法,特別是如何使用 SQLite、CoreData 和 FMDB 來實現數據的存儲、查詢、更新和刪除操作。以下內容已更新為2025年的最佳實踐和最新語法。

使用 SQLite 數據庫進行數據操作

SQLite 是一種輕量級的開源數據庫,適合在 iOS 和 macOS 平台上使用。它提供了簡單的 API 來執行數據的 CRUD 操作。

導入 SQLite 框架

import SQLite

創建 SQLite 數據庫

let db = try Connection("myDatabase.sqlite3") // 更新為最新語法

創建數據表

let table = Table("users") // 定義表名
let id = Expression("id") // 定義欄位
let name = Expression("name")
let email = Expression("email")

try db.run(table.create { t in
    t.column(id, primaryKey: true)
    t.column(name)
    t.column(email)
})

插入數據

let insert = table.insert(name <- "John", email <- "john@example.com")
try db.run(insert)

查詢數據

let query = table.select(name, email).filter(name == "John")
for row in try db.prepare(query) {
    let name = row[name]
    let email = row[email]
    print("name: \(name), email: \(email)")
}

更新數據

let update = table.update(email <- "john_updated@example.com").filter(name == "John")
try db.run(update)

刪除數據

let delete = table.delete().filter(name == "John")
try db.run(delete)

使用 CoreData 進行數據操作

CoreData 是 Apple 提供的框架,用於在 iOS 和 macOS 應用中持久化數據。它提供了簡便的方式來管理數據模型。

導入 CoreData 框架

import CoreData

設置 CoreData 環境

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedContext = appDelegate.persistentContainer.viewContext

創建數據實體

let entity = NSEntityDescription.entity(forEntityName: "User", in: managedContext)!
let user = NSManagedObject(entity: entity, insertInto: managedContext)
user.setValue("John", forKey: "name")
user.setValue("john@example.com", forKey: "email")

do {
    try managedContext.save()
} catch {
    print("Failed saving")
}

查詢數據

let fetchRequest = NSFetchRequest(entityName: "User")
fetchRequest.predicate = NSPredicate(format: "name == %@", "John")

do {
    let users = try managedContext.fetch(fetchRequest)
    for user in users {
        let name = user.value(forKey: "name") as! String
        let email = user.value(forKey: "email") as! String
        print("name: \(name), email: \(email)")
    }
} catch {
    print("Failed fetching")
}

更新數據

for user in users {
    user.setValue("john_updated@example.com", forKey: "email")
}
try managedContext.save()

刪除數據

for user in users {
managedContext.delete(user)
}
try managedContext.save()

使用 FMDB 操作 SQLite 數據庫

FMDB 是一個用於 iOS 和 macOS 的 SQLite 封裝庫,使用起來十分方便。

導入 FMDB 框架

import FMDB

創建 FMDB 數據庫

let db = FMDatabase(path: "myDatabase.sqlite")

創建數據表

let sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)"
if db.open() {
    if db.executeStatements(sql) {
        print("Table created.")
    } else {
        print("Error: \(db.lastErrorMessage())")
    }
    db.close()
} else {
    print("Error: \(db.lastErrorMessage())")
}

插入數據

let sql = "INSERT INTO users (name, email) VALUES (?, ?)"
if db.open() {
    if db.executeUpdate(sql, withArgumentsIn: ["John", "john@example.com"]) {
        print("Row inserted.")
    } else {
        print("Error: \(db.lastErrorMessage())")
    }
    db.close()
}

查詢數據

let sql = "SELECT name, email FROM users WHERE name = ?"
if db.open() {
    let rs = db.executeQuery(sql, withArgumentsIn: ["John"])
    while rs?.next() == true {
        let name = rs?.string(forColumn: "name")
        let email = rs?.string(forColumn: "email")
        print("name: \(name), email: \(email)")
    }
    db.close()
}

更新數據

let sql = "UPDATE users SET email = ? WHERE name = ?"
if db.open() {
    if db.executeUpdate(sql, withArgumentsIn: ["john_updated@example.com", "John"]) {
        print("Row updated.")
    } else {
        print("Error: \(db.lastErrorMessage())")
    }
    db.close()
}

刪除數據

let sql = "DELETE FROM users WHERE name = ?"
if db.open() {
    if db.executeUpdate(sql, withArgumentsIn: ["John"]) {
        print("Row deleted.")
    } else {
        print("Error: \(db.lastErrorMessage())")
    }
    db.close()
}

常見問題解答 (Q&A)

Q1: 在 Swift 中使用 SQLite 時,如何處理數據庫錯誤?

A1: 在操作數據庫時,使用 do-catch 語句來捕捉和處理錯誤是最佳實踐,並且應該提供相應的錯誤訊息以便調試。

Q2: CoreData 和 SQLite 有什麼不同之處?

A2: CoreData 是一個高階框架,它提供了一個對象圖管理器,而 SQLite 是一個低階的數據庫引擎。CoreData 可以自動處理對象的變更追蹤、數據持久化和查詢,適合用於複雜的應用場景。

Q3: 如何選擇在 Swift 中使用哪種數據庫?

A3: 如果需要輕量級的數據存儲,可以選擇 SQLite;如果需要更豐富的模型管理和關聯,則可以考慮 CoreData;如果想要簡化 SQLite 的操作,可以選擇 FMDB。

```
---

Categorized in:

Tagged in:

,