A pure Swift framework wrapping SQLite3.
SQLite.swift aims to be small, simple, and safe.
- A lightweight, uncomplicated query and parameter binding interface
- A flexible, chainable, type-safe query builder
- Safe, automatically-typed data access
- Transactions with implicit commit/rollback
- Developer-friendly error handling and debugging
- Well-documented
- Extensively tested
Explore interactively from the Xcode project’s playground.
import SQLite
let db = Database("path/to/db.sqlite3")
db.execute(
"CREATE TABLE users (" +
"id INTEGER PRIMARY KEY, " +
"email TEXT NOT NULL UNIQUE, " +
"manager_id INTEGER, " +
"FOREIGN KEY(manager_id) REFERENCES users(id)" +
")"
)
let stmt = db.prepare("INSERT INTO users (email) VALUES (?)")
for email in ["alice@example.com", "betsy@example.com"] {
stmt.run(email)
}
db.totalChanges // 2
db.lastChanges // {Some 1}
db.lastID // {Some 2}
for row in db.prepare("SELECT id, email FROM users") {
println("id: \(row[0]), email: \(row[1])")
// id: Optional(1), email: Optional("betsy@example.com")
// id: Optional(2), email: Optional("alice@example.com")
}
db.scalar("SELECT count(*) FROM users") // {Some 2}
let jr = db.prepare("INSERT INTO users (email, manager_id) VALUES (?, ?)")
db.transaction(
stmt.run("dolly@example.com"),
jr.run("emery@example.com", db.lastID)
)
SQLite.swift also exposes a powerful, type-safe query building interface.
let users = db["users"]
let email = Expression<String>("email")
let admin = Expression<Bool>("admin")
let age = Expression<Int>("age")
for user in users.filter(admin && age >= 30).order(age.desc) { /* ... */ }
// SELECT * FROM users WHERE (admin AND (age >= 30)) ORDER BY age DESC
for user in users.group(age, having: count(age) == 1) { /* ... */ }
// SELECT * FROM users GROUP BY age HAVING (count(age) = 1)
users.count
// SELECT count(*) FROM users
users.filter(admin).average(age)
// SELECT average(age) FROM users WHERE admin
if let id = users.insert(email <- "fiona@example.com") { /* ... */ }
// INSERT INTO users (email) VALUES ('fiona@example.com')
let ageless = users.filter(admin && age == nil)
let updates: Int = ageless.update(admin <- false)
// UPDATE users SET admin = 0 WHERE (admin AND (age IS NULL))
Note: SQLite.swift requires Swift 1.1 (available in Xcode 6.1).
To install SQLite.swift:
-
Drag the SQLite.xcodeproj file into your own project. (Submodule, clone, or download the project first.)
-
In your target’s Build Phases, add SQLite iOS (or SQLite Mac) to the Target Dependencies build phase.
-
Add the appropriate SQLite.framework product to the Link Binary With Libraries build phase.
-
Add the same SQLite.framework to a Copy Files build phase with a Frameworks destination. (Add a new build phase if need be.)
- Found a bug or have a feature request? Open an issue.
- Want to contribute? Submit a pull request.
SQLite.swift is available under the MIT license. See the LICENSE file for more information.
Looking for something else? Try another Swift wrapper (or FMDB):