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 № 1Il 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:
Il tuo
?
il segnaposto viene associatosqlite3_bind_text
, ma stai usando1
per il quarto parametro. Ciò significa che utilizzerà solo il primo carattere diuid
corda. Ho il sospetto che volessi usare-1
, un valore negativo, che indicasqlite3_bind_text
per utilizzare l'intera stringa fino al terminatore zero.Dovresti anche usare
SQLITE_TRANSIENT
nel tuosqlite3_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