swift-sqlcipher is a C source packaging of SQLite3 with built-in SQLCipher and Full-text search extensions, along with a SQLiteDB Swift package that provides API parity with the venerable SQLite.swift project.
This is a stand-alone and platform-agnostic project, and
does not presume the presence of any SQLite binary.
It is therefore suitable for embedded projects or
environments without any accessible system sqlite3
library (e.g., Android, Windows).
- A pure-Swift interface
- Embeds a modern and consistent sqlite (3.46.1) and sqlcipher (4.6.1) build in the library
- Works on iOS, macOS, Android, Windows, and Linux
- A type-safe, optional-aware SQL expression builder
- A flexible, chainable, lazy-executing query layer
- Automatically-typed data access
- A lightweight, uncomplicated query and parameter binding interface
- Developer-friendly error handling and debugging
- Full-text search support
- Well-documented
- Extensively tested
- SQLCipher support using the embedded LibTomCrypt library
- Schema query/migration
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 <- "[email protected]")
let rowid = try db.run(insert)
// INSERT INTO "users" ("name", "email") VALUES ('Alice', '[email protected]')
for user in try db.prepare(users) {
print("id: \(user[id]), name: \(user[name]), email: \(user[email])")
// id: 1, name: Optional("Alice"), email: [email protected]
}
// 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 also works as a lightweight, Swift-friendly wrapper over the C API.
// ...
let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)")
for email in ["[email protected]", "[email protected]"] {
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("[email protected]")
// id: Optional(3), email: Optional("[email protected]")
}
try db.scalar("SELECT count(*) FROM users") // 2
The Swift Package Manager is a tool for managing the distribution of Swift code.
- Add the following to your
Package.swift
file:
dependencies: [
.package(url: "https://github.com/skiptools/swift-sqlcipher.git", from "1.2.0")
]
- Build your project:
$ swift build
MIT license. See the LICENSE file for more information.
Here are a number of other popular SQLite alternative packages: