Przygotowałem szybki projekt, aby używać sqlite. czasami podczas wstawiania nie wstawia właściwie (lub wszystkich) wartości. Wiem, ponieważ ponownie uruchomiłem aplikację, a kiedy wrócę, wpisy są albo losowo błędne (z rzeczami, które nie zostały wstawione), albo zero. ale czasami poprawne.sqlite dla swift jest niestabilny
tutaj jest, gdzie ustawić, i tak dane są prawidłowe w wartościach przed wstawieniem.
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)
widać wykomentowane println w środku, jeśli to nie jest komentarzem, wtedy itemName czasami dostaje część tego łańcucha.
Musisz również użyć 'SQLITE_TRANSIENT' dla ostatniego parametru do' sqlite3_bind_text' . – Rob
SQLITE_TRANSIENT nie jest dostępny swift 3? Proszę, czy możesz mi doradzić. –
@SaurabhPrajapati Znalazłem tę odpowiedź, która obejmuje ręczne definiowanie SQLITE_TRANSIENT w Swift 3: https://stackoverflow.com/a/26884081/470339 – Alastair