Swift SQLCipher

swift-sqlcipher 是 SQLite3 的 C 源码封装,内置了 SQLCipher全文搜索 扩展,以及一个 SQLiteDB Swift 包,该包提供了与久负盛名的 SQLite.swift 项目 API 对等的接口。

这是一个独立且平台无关的项目,不依赖任何 SQLite 二进制文件。因此,它适用于嵌入式项目或没有可访问的系统 sqlite3 库的环境(例如,Android、Windows)。

特性

SQLiteDB

import SQLiteDB

let db = try Connection("path/to/db.sqlite3")

// set the (optional) encryption key for the database
// this must be the first action performed on the Connection
try db.key("x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'")

let users = Table("users")
let id = SQLExpression<Int64>("id")
let name = SQLExpression<String?>("name")
let email = SQLExpression<String>("email")

try db.run(users.create { t in
    t.column(id, primaryKey: true)
    t.column(name)
    t.column(email, unique: true)
})
// CREATE TABLE "users" (
//     "id" INTEGER PRIMARY KEY NOT NULL,
//     "name" TEXT,
//     "email" TEXT NOT NULL UNIQUE
// )

let insert = users.insert(name <- "Alice", email <- "alice@mac.com")
let rowid = try db.run(insert)
// INSERT INTO "users" ("name", "email") VALUES ('Alice', 'alice@mac.com')

for user in try db.prepare(users) {
    print("id: \(user[id]), name: \(user[name]), email: \(user[email])")
    // id: 1, name: Optional("Alice"), email: alice@mac.com
}
// SELECT * FROM "users"

let alice = users.filter(id == rowid)

try db.run(alice.update(email <- email.replace("mac.com", with: "me.com")))
// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com')
// WHERE ("id" = 1)

try db.run(alice.delete())
// DELETE FROM "users" WHERE ("id" = 1)

try db.scalar(users.count) // 0
// SELECT count(*) FROM "users"

SQLiteDB 也可用作 C API 之上轻量级、对 Swift 友好的封装。

// ...

let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)")
for email in ["betty@icloud.com", "cathy@icloud.com"] {
    try stmt.run(email)
}

db.totalChanges    // 3
db.changes         // 1
db.lastInsertRowid // 3

for row in try db.prepare("SELECT id, email FROM users") {
    print("id: \(row[0]), email: \(row[1])")
    // id: Optional(2), email: Optional("betty@icloud.com")
    // id: Optional(3), email: Optional("cathy@icloud.com")
}

try db.scalar("SELECT count(*) FROM users") // 2

阅读文档

安装

Swift Package Manager

Swift Package Manager 是一个用于管理 Swift 代码分发的工具。

  1. 将以下内容添加到您的 Package.swift 文件中
dependencies: [
    .package(url: "https://github.com/skiptools/swift-sqlcipher.git", from "1.2.0")
]
  1. 构建您的项目
$ swift build

交流

许可证

MIT 许可证。有关更多信息,请参阅 LICENSE 文件

替代方案

以下是一些其他流行的 SQLite 替代软件包