Skip to content

Commit 806f03c

Browse files
authored
Improving README.md
Because of #988 and #983, I added a do...catch in the usage section, and a production implementation example in the related section.
1 parent 70fb7af commit 806f03c

File tree

1 file changed

+66
-53
lines changed

1 file changed

+66
-53
lines changed

README.md

Lines changed: 66 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -34,67 +34,79 @@ syntax _and_ intent.
3434
```swift
3535
import SQLite
3636

37-
let db = try Connection("path/to/db.sqlite3")
38-
39-
let users = Table("users")
40-
let id = Expression<Int64>("id")
41-
let name = Expression<String?>("name")
42-
let email = Expression<String>("email")
43-
44-
try db.run(users.create { t in
45-
t.column(id, primaryKey: true)
46-
t.column(name)
47-
t.column(email, unique: true)
48-
})
49-
// CREATE TABLE "users" (
50-
// "id" INTEGER PRIMARY KEY NOT NULL,
51-
// "name" TEXT,
52-
// "email" TEXT NOT NULL UNIQUE
53-
// )
54-
55-
let insert = users.insert(name <- "Alice", email <- "[email protected]")
56-
let rowid = try db.run(insert)
57-
// INSERT INTO "users" ("name", "email") VALUES ('Alice', '[email protected]')
58-
59-
for user in try db.prepare(users) {
60-
print("id: \(user[id]), name: \(user[name]), email: \(user[email])")
61-
// id: 1, name: Optional("Alice"), email: [email protected]
37+
// Wrap everything in a do...catch to handle errors
38+
do {
39+
let db = try Connection("path/to/db.sqlite3")
40+
41+
let users = Table("users")
42+
let id = Expression<Int64>("id")
43+
let name = Expression<String?>("name")
44+
let email = Expression<String>("email")
45+
46+
try db.run(users.create { t in
47+
t.column(id, primaryKey: true)
48+
t.column(name)
49+
t.column(email, unique: true)
50+
})
51+
// CREATE TABLE "users" (
52+
// "id" INTEGER PRIMARY KEY NOT NULL,
53+
// "name" TEXT,
54+
// "email" TEXT NOT NULL UNIQUE
55+
// )
56+
57+
let insert = users.insert(name <- "Alice", email <- "[email protected]")
58+
let rowid = try db.run(insert)
59+
// INSERT INTO "users" ("name", "email") VALUES ('Alice', '[email protected]')
60+
61+
for user in try db.prepare(users) {
62+
print("id: \(user[id]), name: \(user[name]), email: \(user[email])")
63+
// id: 1, name: Optional("Alice"), email: [email protected]
64+
}
65+
// SELECT * FROM "users"
66+
67+
let alice = users.filter(id == rowid)
68+
69+
try db.run(alice.update(email <- email.replace("mac.com", with: "me.com")))
70+
// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com')
71+
// WHERE ("id" = 1)
72+
73+
try db.run(alice.delete())
74+
// DELETE FROM "users" WHERE ("id" = 1)
75+
76+
try db.scalar(users.count) // 0
77+
// SELECT count(*) FROM "users"
78+
} catch {
79+
print (error)
6280
}
63-
// SELECT * FROM "users"
64-
65-
let alice = users.filter(id == rowid)
66-
67-
try db.run(alice.update(email <- email.replace("mac.com", with: "me.com")))
68-
// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com')
69-
// WHERE ("id" = 1)
70-
71-
try db.run(alice.delete())
72-
// DELETE FROM "users" WHERE ("id" = 1)
73-
74-
try db.scalar(users.count) // 0
75-
// SELECT count(*) FROM "users"
7681
```
7782

7883
SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C
7984
API.
8085

8186
```swift
82-
let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)")
83-
84-
try stmt.run(email)
87+
// Wrap everything in a do...catch to handle errors
88+
do {
89+
// ...
90+
91+
let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)")
92+
for email in ["[email protected]", "[email protected]"] {
93+
try stmt.run(email)
94+
}
95+
96+
db.totalChanges // 3
97+
db.changes // 1
98+
db.lastInsertRowid // 3
99+
100+
for row in try db.prepare("SELECT id, email FROM users") {
101+
print("id: \(row[0]), email: \(row[1])")
102+
// id: Optional(2), email: Optional("[email protected]")
103+
// id: Optional(3), email: Optional("[email protected]")
104+
}
105+
106+
try db.scalar("SELECT count(*) FROM users") // 2
107+
} catch {
108+
print (error)
85109
}
86-
87-
db.totalChanges // 3
88-
db.changes // 1
89-
db.lastInsertRowid // 3
90-
91-
for row in try db.prepare("SELECT id, email FROM users") {
92-
print("id: \(row[0]), email: \(row[1])")
93-
// id: Optional(2), email: Optional("[email protected]")
94-
// id: Optional(3), email: Optional("[email protected]")
95-
}
96-
97-
try db.scalar("SELECT count(*) FROM users") // 2
98110
```
99111

100112
[Read the documentation][See Documentation] or explore more,
@@ -253,6 +265,7 @@ These projects enhance or use SQLite.swift:
253265

254266
- [SQLiteMigrationManager.swift][] (inspired by
255267
[FMDBMigrationManager][])
268+
- [Delta: Math helper](https://apps.apple.com/app/delta-math-helper/id1436506800) (see [Delta/Utils/Database.swift](https://github.com/GroupeMINASTE/Delta-iOS/blob/master/Delta/Utils/Database.swift) for production implementation example)
256269

257270

258271
## Alternatives

0 commit comments

Comments
 (0)