1. 程式人生 > >[Swift通天遁地]七、數據與安全-(5)使用開源類庫對SQLite數據庫進行高效操作

[Swift通天遁地]七、數據與安全-(5)使用開源類庫對SQLite數據庫進行高效操作

table == 新的 控制臺輸出 tps 所在 和數 all color

本文將演示使用開源類庫對SQLite數據庫進行高效操作。

首先確保在項目中已經安裝了所需的第三方庫。

點擊【Podfile】,查看安裝配置文件。

1 platform :ios, ‘12.02 use_frameworks!
3 
4 target DemoApp do
5     source https://github.com/CocoaPods/Specs.git
6     pod SQLite.swift
7 end

根據配置文件中的相關配置,安裝第三方庫。

在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】

依次實現數據庫和數據表的創建,以及常見的增、刪、改、查等數據庫操作。

  1 import UIKit
  2 //引入已經安裝的第三方類庫
  3 import SQLite
  4 
  5 class ViewController: UIViewController {
  6     
  7     override func viewDidLoad() {
  8         super.viewDidLoad()
  9         // Do any additional setup after loading the view, typically from a nib.
10 //創建數據庫和數據表。 11 createTable() 12 //往數據表中插入幾條數據 13 insertData() 14 //對數據進行檢索操作 15 findRecords() 16 //往數據表中插入幾條數據 17 findRecords() 18 //對數據進行檢索和更新操作 19 filterAndUpdateRecords() 20 //對數據進行刪除操作。 21 deleteRecords()
22 //執行SQL語句。 23 executeSQL() 24 } 25 26 //添加一個方法,用來創建數據庫和數據表。 27 func createTable() 28 { 29 //添加一個異常捕捉語句,用來創建數據庫和數據表。 30 do 31 { 32 //初始化一個沙箱中的文件路徑,作為數據庫保存的位置。 33 let path = NSHomeDirectory() + "/Documents/db.sqlite3" 34 print(path) 35 36 //根據數據庫的路徑,初始化一個數據庫連接對象。 37 let db = try Connection(path) 38 39 //初始化一個指定名稱的數據表 40 let users = Table("users") 41 //初始化一個整形常量,作為數據表中的id字段。 42 let id = Expression<Int64>("id") 43 //初始化一個整形常量,作為數據表中的name字段。 44 let name = Expression<String?>("name") 45 //初始化一個整形常量,作為數據表中的email字段。 46 let email = Expression<String>("email") 47 48 //通過調用數據庫連接對象的執行命令,創建一張新的數據表。 49 try db.run(users.create { t in 50 //往數據表中添加一個字段,並設置該字段為數據表的主鍵。 51 t.column(id, primaryKey: true) 52 //將name字段也添加到數據表中 53 t.column(name) 54 //將email字段也添加到數據表中, 55 //並設置郵箱字段中的數據具有唯一性。 56 t.column(email, unique: true) 57 }) 58 } 59 catch 60 { 61 print("Something went wrong :(") 62 } 63 } 64 65 //添加一個方法,往數據表中插入幾條數據。 66 func insertData() 67 { 68 //添加一個異常捕捉語句,用來執行數據的插入操作。 69 do 70 { 71 //初始化一個字符串常量,作為數據庫文件所在的路徑。 72 let path = NSHomeDirectory() + "/Documents/db.sqlite3" 73 //創建數據庫連接對象 74 let db = try Connection(path) 75 76 //創建一個數據表對象 77 let users = Table("users") 78 //初始化兩個字段,分別表示名稱字段和郵箱字段。 79 let name = Expression<String?>("name") 80 let email = Expression<String>("email") 81 82 //往數據表中插入一條記錄, 83 //並設置這條記錄的兩個字段的值。 84 let insert = users.insert(name <- "Alice", email <- "[email protected]") 85 //通過調用數據庫連接對象的執行命令,執行數據表插入語句。 86 //並獲得返回的記錄的唯一標識符。 87 let rowid = try db.run(insert) 88 //在控制臺輸出記錄的唯一標識符。 89 print(">>>>>>>>>>>\(rowid)") 90 } 91 catch 92 { 93 print("Something went wrong :(") 94 } 95 } 96 97 //添加一個方法,對數據進行檢索操作 98 func findRecords() 99 { 100 //添加一個異常捕捉語句,對數據進行檢索操作 101 do 102 { 103 //初始化一個字符串常量,作為數據庫文件所在的路徑。 104 let path = NSHomeDirectory() + "/Documents/db.sqlite3" 105 //創建數據庫連接對象 106 let db = try Connection(path) 107 //創建一個數據表對象 108 let users = Table("users") 109 110 //初始化三個字段常量 111 let id = Expression<Int64>("id") 112 let name = Expression<String?>("name") 113 let email = Expression<String>("email") 114 115 //通過調用數據庫連接對象的指定方法,獲得指定表中的所有記錄。 116 //並對記錄列表進行遍歷。 117 for user in try db.prepare(users) 118 { 119 //在控制臺輸出記錄的各個字段的值 120 print(">>>>>>>id: \(user[id]), name: \(String(describing: user[name])), email: \(user[email])") 121 } 122 123 //通過調用數據庫連接對象的指定方法,獲得指定表中的所有記錄的數量。 124 let count = try db.scalar(users.count) 125 //並在控制臺輸出 126 print(">>>>>>>\(count)") 127 } 128 catch 129 { 130 print("Something went wrong :(") 131 } 132 } 133 134 //添加一個方法,對數據進行檢索和更新操作 135 func filterAndUpdateRecords() 136 { 137 //添加一個異常捕捉語句,對數據進行檢索和更新操作 138 do 139 { 140 //初始化一個字符串常量,作為數據庫文件所在的路徑。 141 let path = NSHomeDirectory() + "/Documents/db.sqlite3" 142 //創建數據庫連接對象 143 let db = try Connection(path) 144 //創建一個數據表對象 145 let users = Table("users") 146 147 //初始化三個字段常量 148 let id = Expression<Int64>("id") 149 let name = Expression<String?>("name") 150 let email = Expression<String>("email") 151 152 //通過調用數據庫連接對象的過濾方法,查找索引值為1的記錄。 153 let user = users.filter(id == 1) 154 //通過調用數據庫連接對象的執行方法,執行數據表的更新操作。 155 //替換索引值為1的記錄的郵箱字段中的數據。 156 let result = try db.run(user.update(email <- email.replace("strengthen.com", with: "strengthen.net"))) 157 print(">>>>>>>id: \(result)") 158 159 //再次檢索數據表中的所有數據,並通過一個循環。 160 for user in try db.prepare(users) 161 { 162 //在控制臺輸出記錄的各個字段的值。 163 print(">>>>>>>id: \(user[id]), name: \(String(describing: user[name])), email: \(user[email])") 164 } 165 } 166 catch 167 { 168 print("Something went wrong :(") 169 } 170 } 171 172 //添加一個方法,對數據進行刪除操作。 173 func deleteRecords() 174 { 175 //添加一個異常捕捉語句,執行對數據的刪除操作。 176 do 177 { 178 //初始化一個字符串常量,作為數據庫文件所在的路徑。 179 let path = NSHomeDirectory() + "/Documents/db.sqlite3" 180 //創建數據庫連接對象 181 let db = try Connection(path) 182 //創建一個數據表對象 183 let users = Table("users") 184 185 //初始化一個字段常量 186 let id = Expression<Int64>("id") 187 //通過調用數據庫連接對象的過濾方法,查找索引值為1的記錄。 188 let user = users.filter(id == 1) 189 //通過調用數據庫連接對象的執行方法,執行數據表的刪除操作。 190 let resut = try db.run(user.delete()) 191 //在控制臺輸出刪除操作的執行結果。 192 print(">>>>>>>\(resut)") 193 194 //通過調用數據庫連接對象的方法,獲得指定表中的所有記錄的數量。 195 let count = try db.scalar(users.count) 196 print(">>>>>>>\(count)") 197 } 198 catch 199 { 200 print("Something went wrong :(") 201 } 202 } 203 204 //添加一個方法,執行SQL語句。 205 func executeSQL() 206 { 207 //添加一個異常捕捉語句,執行SQL語句。 208 do 209 { 210 //初始化一個字符串常量,作為數據庫文件所在的路徑。 211 let path = NSHomeDirectory() + "/Documents/db.sqlite3" 212 //創建數據庫連接對象 213 let db = try Connection(path) 214 //通過調用數據庫連接對象的方法,執行一條用來插入的語句。 215 let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)") 216 //通過一個循環,往數據表中依次插入兩個記錄。 217 for email in ["[email protected]", "[email protected]"] 218 { 219 try stmt.run(email) 220 } 221 222 //在控制臺輸出,數據庫連接對象的狀態信息。 223 print(">>>>>>>\(db.totalChanges)") 224 print(">>>>>>>\(db.changes)") 225 print(">>>>>>>\(db.lastInsertRowid)") 226 227 //通過一條語句,執行一次查詢操作, 228 for row in try db.prepare("SELECT id, email FROM users") 229 { 230 //查詢並輸出表中的所有索引值和郵箱信息 231 print(">>>>>>>id: \(row[0] ?? ""), email: \(row[1] ?? "")") 232 } 233 234 //執行一條查詢所有記錄數量的語句 235 let result = try db.scalar("SELECT count(*) FROM users") 236 //並在控制臺輸出記錄的數量 237 print(">>>>>>>\(result ?? 0)") 238 } 239 catch 240 { 241 print("Something went wrong :(") 242 } 243 } 244 245 override func didReceiveMemoryWarning() { 246 super.didReceiveMemoryWarning() 247 // Dispose of any resources that can be recreated. 248 } 249 }

[Swift通天遁地]七、數據與安全-(5)使用開源類庫對SQLite數據庫進行高效操作