[Swift通天遁地]七、数据与安全-(5)高效操作SQLite数据库
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10303151.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
本文将演示使用开源类库对SQLite数据库进行高效操作。
首先确保在项目中已经安装了所需的第三方库。
点击【Podfile】,查看安装配置文件。
1 platform :ios, ‘12.0’ 2 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 <- "alice@strengthen.com") 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 ["leo@strengthen.com", "jame@strengthen.com"] 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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)