返回 导航

Swift

hangge.com

Swift - 第三方SQLite库FMDB使用详解3(事务:批量操作、回滚)

作者:hangge | 2019-04-09 08:10

五、事务操作

1,事务介绍

(1)有时我们要对大批量的数据进行操作。比如同时插入大量的数据,如果每插入一条就提交一次的话就会比较耗时。
(2)FMDB 提供的 FMDatabaseQueue 对象可以使用事务进行批量操作,大大缩短了插入时间。同时它还支持回滚,只要中间有一条语句执行错误,就会自动全部恢复成最初的状态。

2,批量操作样例

(1)下面我使用事务同时插入 10 条数据。SQLiteManager 是我封装的一个数据库工具类,具体内容可看之前的文章(点击查看
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)

回到顶部