@@ -34,67 +34,79 @@ syntax _and_ intent.
34
34
``` swift
35
35
import SQLite
36
36
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)
62
80
}
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"
76
81
```
77
82
78
83
SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C
79
84
API.
80
85
81
86
``` 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
+
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)
85
109
}
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
98
110
```
99
111
100
112
[ Read the documentation] [ See Documentation ] or explore more,
@@ -253,6 +265,7 @@ These projects enhance or use SQLite.swift:
253
265
254
266
- [SQLiteMigrationManager .swift][] (inspired by
255
267
[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)
256
269
257
270
258
271
# # Alternatives
0 commit comments