/ / SQLite «où» renvoie 21 - swift, sqlite3

SQLite “où” retourne 21 - swift, sqlite3

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 № 1

le 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:

  1. Votre ? espace réservé est lié à sqlite3_bind_text, mais vous utilisez 1 pour le quatrième paramètre. Cela signifie qu'il n'utilisera que le premier caractère du uid chaîne. Je suppose que vous vouliez utiliser -1, une valeur négative, qui indique sqlite3_bind_text pour utiliser la chaîne entière jusqu'au terminateur zéro.

  2. Vous devriez aussi utiliser SQLITE_TRANSIENT dans ton sqlite3_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