/ / SQLite "dove" restituisce 21 - swift, sqlite3

SQLite "dove" restituisce 21 - swift, sqlite3

Sto cercando di ottenere dal tavolo tutto il righe quello ha lo stesso ID UTENTE Sto pensando che qualcosa non va sqlite3_prepare_v2 o con sqlite3_bind_text, per eseguire il debug di questo codice, Ho stampato

print(sqlite3_step(sqlite3_stmt))
print(sqlite3_step(sqlite3_stmt))

Per la prima volta stampato come 101 e la seconda volta stampata 21

Tuttavia, "SELECT * da IMAGE_TABLE" funziona correttamente

Grazie!

  var sqlite3_stmt: OpaquePointer? = nil

if (sqlite3_prepare_v2(database,"SELECT * from IMAGE_TABLE where USERID = ?;",-1,&sqlite3_stmt,nil) == SQLITE_OK){


sqlite3_bind_text(sqlite3_stmt, 1, uid.cString(using: .utf8), 1,nil);

while(sqlite3_step(sqlite3_stmt) == SQLITE_ROW){


let imageDescription = String(validatingUTF8:sqlite3_column_text(sqlite3_stmt,0))
let imageUrl = String(validatingUTF8:sqlite3_column_text(sqlite3_stmt,2))
let imageName = String(validatingUTF8:sqlite3_column_text(sqlite3_stmt,3))
let pic = Picture(imageDescription!,imageUrl!,imageName!)
picList.append(pic)
}

risposte:

2 per risposta № 1

Il 101 è SQLITE_DONE, il che significa che non ci sono più righe da restituire, ovvero che non c'erano record corrispondenti al tuo WHERE clausola. Il 21 è SQLITE_MISUSE, perché hai chiamato sqlite3_step per recuperare il record successivo dopo che ti ha appena detto che non c'erano più record.

Ci sono due problemi qui:

  1. Il tuo ? il segnaposto viene associato sqlite3_bind_text, ma stai usando 1 per il quarto parametro. Ciò significa che utilizzerà solo il primo carattere di uid corda. Ho il sospetto che volessi usare -1, un valore negativo, che indica sqlite3_bind_text per utilizzare l'intera stringa fino al terminatore zero.

  2. Dovresti anche usare SQLITE_TRANSIENT nel tuo sqlite3_bind_text chiamata. Quindi, se non l'hai già, definisci quelle costanti:

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

    E poi usalo nel tuo sqlite3_bind_text chiamata:

    guard sqlite3_bind_text(statement, 1, uid.cString(using: .utf8), -1, SQLITE_TRANSIENT) == SQLITE_OK else {
    ...
    }
    

    Ciò indica a SQLite di creare la propria copia di quella stringa C, poiché non si hanno garanzie sulla durata della propria stringa C.


0 per risposta № 2

Grazie ora funziona alla grande con SQLITE_TRANSIENT