sqlite for swift is unstable

前端 未结 3 524
谎友^
谎友^ 2020-12-10 03:14

I\'ve set up swift project to use sqlite. sometimes, when inserting it doesn\'t actually insert the correct (or all) the values. I know because I restart the app, and when

3条回答
  •  攒了一身酷
    2020-12-10 03:57

    In swift SQLite doesn't have SQLITE_TRANSIENT and SQLITE_STATIC defined, so we need to explicitly define it.

    swift 3 & 4

    Define following property of SQLITE

    let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self)
    let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
    

    SQL function Add SQLITE_TRANSIENT instead of nil as last parameter while binding text 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)
    

    Referenced from SQLITE_TRANSIENT undefined in Swift

提交回复
热议问题