[Swift通天遁地]七、数据与安全-(5)使用开源类库对SQLite数据库进行高效操作

本文将演示使用开源类库对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 }

猜你喜欢

转载自www.cnblogs.com/strengthen/p/10303151.html