作者:日后再曰 | 来源:互联网 | 2022-12-19 18:37
我正在尝试将来自用户输入的数据插入到已设置的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
}
从文本字段中提取了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);
}
我期望从输出中看到的是:
1个
用户名
用户电子邮件
我看到的是:
1个
蝙蝠侠
用户电子邮件
我的插入语句有问题吗?
1> muchtoonice..:
找到了答案:
存在一个问题,该问题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)
至:
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)
以SQLITE_TRANSIENT
定义为:
let SQLITE_TRANSIENT = unsafeBitCast(OpaquePointer(bitPattern: -1), to: sqlite3_destructor_type.self)
现在,查询时数据可以正确返回。