数据被插入到SQLITE3的错误列中

muc*_*ice 1 sqlite swift

我正在尝试将来自用户输入的数据插入到已设置的SQLite数据库中。这是我当前编写的代码:

var stmt: OpaquePointer?
let queryString = "INSERT INTO entries (id, name, email, avatar) VALUES (NULL,?,?,?)"

if(sqlite3_prepare_v2(db, queryString, -1, &stmt, nil) == SQLITE_OK){
        sqlite3_bind_text(stmt, 1, strName, -1, nil)
        sqlite3_bind_text(stmt, 2, strEmail, -1, nil)
        sqlite3_bind_text(stmt, 3, "batman", -1, nil)
    }

else{
        let errMsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing insert: \(errMsg)")
        return
}
Run Code Online (Sandbox Code Playgroud)

从文本字段中提取了strName和strEmail。当我在另一个视图中查询此数据时,由于某种原因“蝙蝠侠”已插入第二列而不是用户输入。这是选择查询:

let queryString = "SELECT * FROM entries"
var stmt: OpaquePointer?

if sqlite3_prepare_v2(db, queryString, -1, &stmt, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing select: \(errmsg)")
        return
}

while(sqlite3_step(stmt) == SQLITE_ROW){
        let id = sqlite3_column_int(stmt, 0)
        let name = String(cString: sqlite3_column_text(stmt, 1))
        let email = String(cString: sqlite3_column_text(stmt, 2))

        userList.append(User(id: Int(id), name: String(describing: name), email: String(describing: email)))
        print (id);
        print (name);
        print (email);
}
Run Code Online (Sandbox Code Playgroud)

我期望从输出中看到的是:

  1. 1个
  2. 用户名
  3. 用户电子邮件

我看到的是:

  1. 1个
  2. 蝙蝠侠
  3. 用户电子邮件

我的插入语句有问题吗?

muc*_*ice 5

找到了答案:

存在一个问题,该问题sqlite3_bind_text导致将不正确的数据插入错误的行。

将bind语句从以下更改:

sqlite3_bind_text(stmt, 1, strName, -1, nil)
sqlite3_bind_text(stmt, 2, strEmail, -1, nil)
sqlite3_bind_text(stmt, 3, "batman", -1, nil)
Run Code Online (Sandbox Code Playgroud)

至:

sqlite3_bind_text(stmt, 1, strName, -1, SQLITE_TRANSIENT)
sqlite3_bind_text(stmt, 2, strEmail, -1, SQLITE_TRANSIENT)
sqlite3_bind_text(stmt, 3, "batman", -1, SQLITE_TRANSIENT)
Run Code Online (Sandbox Code Playgroud)

SQLITE_TRANSIENT定义为:

let SQLITE_TRANSIENT = unsafeBitCast(OpaquePointer(bitPattern: -1), to: sqlite3_destructor_type.self)
Run Code Online (Sandbox Code Playgroud)

现在,查询时数据可以正确返回。