Swift - 第三方SQLite库FMDB使用详解3(事务:批量操作、回滚)
作者:hangge | 2019-04-09 08:10
五、事务操作
1,事务介绍
(1)有时我们要对大批量的数据进行操作。比如同时插入大量的数据,如果每插入一条就提交一次的话就会比较耗时。
(2)FMDB 提供的 FMDatabaseQueue 对象可以使用事务进行批量操作,大大缩短了插入时间。同时它还支持回滚,只要中间有一条语句执行错误,就会自动全部恢复成最初的状态。
2,批量操作样例
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 插入数据
insertData()
}
// 插入数据
func insertData() {
// 使用事务插入10条数据
if let queue = SQLiteManager.shareManger().dbQueue {
queue.inTransaction { db, rollback in
do {
for i in 0..<10 {
try db.executeUpdate("INSERT INTO User (name, age) VALUES (?,?);",
values: ["hangge", i])
}
print("插入成功!")
} catch {
print("插入失败,进行回滚!")
rollback.pointee = true
}
}
}
}
}
(2)打开数据库可以看到数据插入成功了:

3,事务回滚样例
(1)下面我在插入第 5 条数据时故意写错表名,造成插入失败。由于 catch 捕获错误后,我们又将 rollback.pointee 设为 true,则会触发回滚,那么之前插入的 4 条数据则也自动清除。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 插入数据
insertData()
}
// 插入数据
func insertData() {
// 使用事务插入10条数据
if let queue = SQLiteManager.shareManger().dbQueue {
queue.inTransaction { db, rollback in
do {
for i in 0..<10 {
if i == 4 {
try db.executeUpdate("INSERT INTO UserXXX (name, age) VALUES (?,?);",
values: ["hangge", i])
} else {
try db.executeUpdate("INSERT INTO User (name, age) VALUES (?,?);",
values: ["hangge", i])
}
}
print("插入成功!")
} catch {
print("插入失败,进行回滚!")
rollback.pointee = true
}
}
}
}
}
(2)打开数据库可以发现数据确实一条都没插入:
全部评论(0)