sqlite for swift不稳定

Jas*_*n G 15 sqlite ios swift

我已经设置了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)
Run Code Online (Sandbox Code Playgroud)

你可以在中间看到注释掉的println,如果没有注释掉,那么itemName有时会得到该字符串的一部分.

Tha*_*ong 23

我有同样的问题.我找到了解决这个问题的方法.

sqlite3_bind_text(statement, 1, itemName, -1, nil) --> itemName should be UTF8 String
Run Code Online (Sandbox Code Playgroud)

您应该将itemName转换为NSString并使用UTF8String将您的字符串转换为UTF8.正确的代码在这里是相同的

let itemName = item.itemName as NSString
sqlite3_bind_text(statement, 1, itemName.UTF8String, -1, nil)
Run Code Online (Sandbox Code Playgroud)

祝好运.

  • 您还必须使用SQLITE_TRANSIENT作​​为sqlite3_bind_text的最后一个参数。 (2认同)
  • @SaurabhPrajapati我发现这个答案涵盖了在Swift 3中手动定义SQLITE_TRANSIENT:/sf/answers/1881885701/ (2认同)

Dip*_*ara 6

在迅速SQLite没有SQLITE_TRANSIENTSQLITE_STATIC定义,所以我们需要明确的定义。

迅速3&4

定义SQLITE的以下属性

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

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)
Run Code Online (Sandbox Code Playgroud)

在Swift中未定义的SQLITE_TRANSIENT引用