Voir https://stackoverflow.com/a/17994313/1271826 pour un exemple de la façon d'utiliser sqlite3_bind_blob
pour stocker votre NSData
dans la base de données.
En outre, vous devez absolument éviter d'utiliser stringWithFormat
pour générer des instructions SQL en général. Et si l'adresse était 123 O'Brian Way
ou Martha's Vineyard
? Cette apostrophe termine prématurément la chaîne que vous insérez. Les guillemets doubles ne sont pas meilleurs, quand vous allez insérer Jimmy "The Greek" Snyder
ou Dwayne "The Rock" Johnson
. Pire, un utilisateur malveillant pourrait faire des ravages avec l'injection SQL. Vous devez utiliser les espaces réservés ?
et la fonction sqlite3_bind_blob
pour NSData
. Et pour vos chaînes, utilisez sqlite3_bind_text
.
Ainsi:
UIImage *uiimg = img.image;
NSData *data = UIImagePNGRepresentation(uiimg);
const char *sql = "update APPUSERS set name = ?, u_name = ?, contact_no = ?, address = ?, dob = ?, pswrd = ?, confirm_pswrd = ?, img = ? where u_name =?";
if (sqlite3_prepare_v2(database, sql, -1, &update_statement, NULL) != SQLITE_OK)
NSLog(@"prepare failed: %s", sqlite3_errmsg(database));
if (sqlite3_bind_text(update_statement, 1, [name.text UTF8String], -1, NULL) != SQLITE_OK)
NSLog(@"bind 1 failed: %s", sqlite3_errmsg(database));
if (sqlite3_bind_text(update_statement, 2, [uname.text UTF8String], -1, NULL) != SQLITE_OK)
NSLog(@"bind 2 failed: %s", sqlite3_errmsg(database));
if (sqlite3_bind_text(update_statement, 3, [pnoneno.text UTF8String], -1, NULL) != SQLITE_OK)
NSLog(@"bind 3 failed: %s", sqlite3_errmsg(database));
if (sqlite3_bind_text(update_statement, 4, [address.text UTF8String], -1, NULL) != SQLITE_OK)
NSLog(@"bind 4 failed: %s", sqlite3_errmsg(database));
if (sqlite3_bind_text(update_statement, 5, [dob.text UTF8String], -1, NULL) != SQLITE_OK)
NSLog(@"bind 5 failed: %s", sqlite3_errmsg(database));
if (sqlite3_bind_text(update_statement, 6, [password.text UTF8String], -1, NULL) != SQLITE_OK)
NSLog(@"bind 6 failed: %s", sqlite3_errmsg(database));
if (sqlite3_bind_text(update_statement, 7, [confirmpassword.text UTF8String], -1, NULL) != SQLITE_OK)
NSLog(@"bind 7 failed: %s", sqlite3_errmsg(database));
// note, use blob here
if (sqlite3_bind_blob(update_statement, 8, [data bytes], [data length], SQLITE_TRANSIENT) != SQLITE_OK)
NSLog(@"bind 8 failed: %s", sqlite3_errmsg(database));
if (sqlite3_bind_text(update_statement, 9, [tempstore UTF8String], -1, NULL) != SQLITE_OK)
NSLog(@"bind 9 failed: %s", sqlite3_errmsg(database));
if (sqlite3_step(update_statement) == SQLITE_DONE)
{
NSLog(@"success");
}
else
{
NSLog(@"failed: %s", sqlite3_errmsg(database));
}
sqlite3_finalize(update_statement);
Note, en plus de faire sqlite3_bind_xxx
, je suggère aussi (a) ne pas oublier de faire sqlite3_prepare_v2
d'abord; (b) sur toute erreur, regardez sqlite3_errmsg
; et (c) n'oubliez pas de faire sqlite3_finalize
à la fin pour libérer votre mémoire. Notez cependant que SQLite est notablement inefficace pour stocker de gros blobs. Si les images sont de petites vignettes, cela ne pose pas de problème, mais pour les grandes images, vous devriez enregistrer l'image dans votre dossier Documents
, puis seulement sauvegarder le chemin du fichier dans votre base de données. Enfin, notez que si vous aviez une image chargée dans un UIImage
que vous avez ensuite récupérée via UIImagePNGRepresentation
, cela peut entraîner une perte de données ou une augmentation considérable du fichier. Cela dépend de la source originale de l'image. Les gens supposent souvent que s'ils le font UIImagePNGRepresentation
, ils ont la garantie d'obtenir la même image, et bien que cela puisse sembler pratiquement identique, il peut être modifié dans le processus (pas toujours, cela dépend). Si vous avez accès à l'actif/fichier original/NSData
que vous avez utilisé pour définir le UIImage
, vous devez simplement vous y reporter. En outre, vous ne devriez pas non plus stocker les mots de passe en clair dans votre base de données. Vous devez les crypter ou utiliser un keychain pour stocker les mots de passe.
lors de l'exécution de sqlite3_bind_text pour tous les champs, les données ne sont pas mises à jour. Pourquoi utiliser cette méthode pour enregistrer des données et des images? – Anand3777
je reçois problème lors de la mise à jour, pas dans l'insertion .. – Anand3777
@ user2315316 Peu importe. Vous devriez toujours faire 'sqlite3_bind_xxx', que ce soit' INSERT', 'UPDATE', ou même juste une clause' WHERE' dans une instruction 'SELECT'.Si ça ne fonctionnait pas avec 'sqlite3_bind_xxx' avant, vous n'avez probablement pas regardé' sqlite3_errmsg' pour identifier la source du problème et y remédier. Notez que si l'une de ces valeurs pouvait être 'nil', vous devriez aussi vérifier cette condition, et utiliser' sqlite3_bind_null' dans ce cas. – Rob