使用事务插入是抛出错误Sqlite.swift

我创build了一个数据库类,如下所示:

class Database { static let instance = Database() private let categories = Table("Category") private var db: Connection? let cat_id = Expression<String>("id") let cat_name = Expression<String>("name") private init() { let path = NSSearchPathForDirectoriesInDomains( .documentDirectory, .userDomainMask, true ).first! do { db = try Connection("\(path)/SalesPresenterDatabase.sqlite3") createTable() } catch { print("error") } } func createTable() { do{ try self.db!.run(self.categories.create(ifNotExists: true) { table in table.column(self.cat_id) table.column(self.cat_name) }) }catch{ print("error") } } func addRow(table: DBTableNames, object: [Any]) -> Int64? { do { try self.db!.transaction() { for obj in object{ if table.rawValue == DBTableNames.Category.rawValue{ let cats : CategoryObject = obj as! CategoryObject let insert = self.categories.insert(self.cat_id <- cats.id, self.cat_name <- cats.name) try self.db!.run(insert) } } } }catch{ print("Insert failed \(error)") return -1 } return 1 } } 

然后我继续通过运行以下代码来调用我的代码来添加一行:

  let returnValue = Database.instance.addRow(table: DBTableNames(rawValue: entity)!, object: databaseObject) 

我有的问题是,它总是会抛出一个错误说:

插入失败操作无法完成。 (SQLite.Result错误0.)和完整:不能回滚 – 没有事务处于活动状态(代码:1)

如果再次看到这个错误,我的Mac将会出现在窗口之外!

整个操作是在后台线程,但我也尝试了以下:

  DispatchQueue.main.async{ let returnValue = Database.instance.addRow(table: DBTableNames(rawValue: entity)!, object: databaseObject) } 

它没有工作。 这是没有道理的,因为我也尝试在交易中创build表,并完美地工作。

任何帮助将不胜感激!

你的func createTable()func addRow()方法不是线程安全的。 多个线程可以同时访问它。

在你的Singleton类中创build一个私有的串行DispatchQueue ,并通过这个串行队列完成上述function。 这将阻止同时从多个线程访问数据库,串行队列将排队并发任务。