作者:LKD2008_561 | 来源:互联网 | 2023-05-25 09:09
我已经设置了swift项目来使用sqlite.有时,插入时实际上并不插入正确的(或全部)值.我知道,因为我重新启动应用程序,当我回来时,条目是随机错误(没有插入的东西)或零.但有时是正确的.
这里是我设置的地方,是的,插入前数据的数据是正确的.
let update = "INSERT INTO ToDoItem (itemName, completed, goalDate) " + "VALUES (?, ?, ?);"
var statement: COpaquePointer = nil
if sqlite3_prepare_v2(database, update, -1, &statement, nil) == SQLITE_OK {
let itemName = item.itemName as String
let completed = item.completed == true ? 1 : 0
sqlite3_bind_text(statement, 1, itemName, -1, nil)
sqlite3_bind_int(statement, 2, Int32(completed))
if let goalDate = item.goalDate?.toString() {
sqlite3_bind_text(statement, 3, goalDate, -1, nil)
} else {
sqlite3_bind_text(statement, 3, "", -1, nil)
}
//println("inserting \(itemName), \(completed) and \(item.goalDate?.toString())")
//println("")
}
if sqlite3_step(statement) != SQLITE_DONE {
println("error updateing table")
sqlite3_close(database)
return
}
sqlite3_finalize(statement)
sqlite3_close(database)
你可以在中间看到注释掉的println,如果没有注释掉,那么itemName有时会得到该字符串的一部分.
1> Thanh Truong..:
我有同样的问题.我找到了解决这个问题的方法.
sqlite3_bind_text(statement, 1, itemName, -1, nil) --> itemName should be UTF8 String
您应该将itemName转换为NSString并使用UTF8String将您的字符串转换为UTF8.正确的代码在这里是相同的
let itemName = item.itemName as NSString
sqlite3_bind_text(statement, 1, itemName.UTF8String, -1, nil)
祝好运.
您还必须使用SQLITE_TRANSIENT作为sqlite3_bind_text的最后一个参数。
@SaurabhPrajapati我发现这个答案涵盖了在Swift 3中手动定义SQLITE_TRANSIENT:/sf/ask/17360801/
2> Dipen Pancha..:
在迅速SQLite没有SQLITE_TRANSIENT
和SQLITE_STATIC
定义,所以我们需要明确的定义。
迅速3&4
定义SQLITE的以下属性
let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self)
let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
SQL函数在绑定文本时
添加SQLITE_TRANSIENT
而不是nil
最后一个参数sqlite3_bind_text
。
let update = "INSERT INTO ToDoItem (itemName, completed, goalDate) " + "VALUES (?, ?, ?);"
var statement: OpaquePointer = nil
if sqlite3_prepare_v2(database, update, -1, &statement, nil) == SQLITE_OK {
let itemName = item.itemName as String
let completed = item.completed == true ? 1 : 0
sqlite3_bind_text(statement, 1, itemName, -1, SQLITE_TRANSIENT)
sqlite3_bind_int(statement, 2, Int32(completed))
if let goalDate = item.goalDate?.toString() {
sqlite3_bind_text(statement, 3, goalDate, -1, SQLITE_TRANSIENT)
} else {
sqlite3_bind_text(statement, 3, "", -1, SQLITE_TRANSIENT)
}
//println("inserting \(itemName), \(completed) and \(item.goalDate?.toString())")
//println("")
}
if sqlite3_step(statement) != SQLITE_DONE {
println("error updateing table")
sqlite3_close(database)
return
}
sqlite3_finalize(statement)
sqlite3_close(database)
在Swift中未定义的从SQLITE_TRANSIENT引用