Deadline 项目(2)—— SQLite.swift 相关

unwrap lastInsertRowId found unexpected nil
最近发现的一个 SQLite.swift 的 bug (也能说不是 BUG )
这是我们在定义了父亲兄弟的数据结构储存树的情况下,选择将根节点定义为 0 时出现的错误。

SQLite

默认情况下,SQLite会自动存在一个RowID 列,从1开始,每添加一条记录+1。
当设置了主键,而且主键的类型为integer时,查询RowID等于主键。

SQLite.swift

sqlite.swift 在对 RowId 的处理方法为:
1 ) "If no successful INSERTs into rowid tables have ever occurred on the database connection D, then sqlite3_last_insert_rowid(D) returns zero."

  1. constraint violation = also return zero.

在返回 lastInsertRowid 的时候,就会因为强制unwarp lastInsertRowid 而 crash

public var lastInsertRowid: Int64? {
        let rowid = sqlite3_last_insert_rowid(handle)
        return rowid > 0 ? rowid : nil
}
解决方案

不使用 0 和负数的主键即可。

更新:pull request 被接受了,现在可以使用负数了,虽然 0 还是不可以使用。

你可能感兴趣的:(Deadline 项目(2)—— SQLite.swift 相关)