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