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 还是不可以使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容