J'essaie de sortir du table tous les des rangs qui ont le même IDENTIFIANT D'UTILISATEUR Je pense que quelque chose ne va pas sqlite3_prepare_v2 ou avec sqlite3_bind_text, pour déboguer cela code, J'ai imprimé
print(sqlite3_step(sqlite3_stmt))
print(sqlite3_step(sqlite3_stmt))
Dans le premier temps imprimé comme 101 et la deuxième fois imprimé 21
Cependant, "SELECT * from IMAGE_TABLE" fonctionne bien
Merci!
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)
}
Réponses:
2 pour la réponse № 1le 101
est SQLITE_DONE
, ce qui signifie qu'il n'y a plus de lignes à renvoyer, c'est-à-dire qu'aucun enregistrement ne correspond à votre WHERE
clause. le 21
est SQLITE_MISUSE
, parce que tu as appelé sqlite3_step
pour récupérer le prochain enregistrement après qu'il vient de vous dire qu'il n'y avait plus d'enregistrements.
Ici, nous avons deux problèmes:
Votre
?
espace réservé est lié àsqlite3_bind_text
, mais vous utilisez1
pour le quatrième paramètre. Cela signifie qu'il n'utilisera que le premier caractère duuid
chaîne. Je suppose que vous vouliez utiliser-1
, une valeur négative, qui indiquesqlite3_bind_text
pour utiliser la chaîne entière jusqu'au terminateur zéro.Vous devriez aussi utiliser
SQLITE_TRANSIENT
dans tonsqlite3_bind_text
appel. Donc, si vous ne l'avez pas déjà fait, définissez ces constantes:internal let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self) internal let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
Et puis utilisez-le dans votre
sqlite3_bind_text
appel:guard sqlite3_bind_text(statement, 1, uid.cString(using: .utf8), -1, SQLITE_TRANSIENT) == SQLITE_OK else { ... }
Cela demande à SQLite de faire sa propre copie de cette chaîne C, car vous n'avez aucune assurance concernant la durée de vie de votre propre chaîne C.
0 pour la réponse № 2
Merci ça marche très bien maintenant avec SQLITE_TRANSIENT