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)