2013-08-29 8 views
-2

je veux stocker des données avec une image en utilisant cette requête, tout mettre à jour correctement, mais la colonne d'image est toujours null.je ne sais pas ce qui ne va pas dans cette requête.please anybody help Je le répare. Je suis nouveau sur iOS et sqlite aussi.comment mettre à jour l'image en sqlite en utilisant ios

UIImage *uiimg = img.image; 
    NSData *data = UIImagePNGRepresentation(uiimg); 

    NSString *cmd = [NSString stringWithFormat:@"update APPUSERS set name = '%@', u_name =   '%@', contact_no = '%@', address = '%@', dob = '%@', pswrd = '%@', confirm_pswrd = '%@', img = '%d' where u_name ='%@'",name.text, uname.text, pnoneno.text, address.text, dob.text, password.text, confirmpassword.text, data, tempstore] ; 

    const char * sql = [cmd UTF8String]; 


    if (sqlite3_step(update_statement) == SQLITE_DONE) 
    { 
      NSLog(@"success"); 
    } 
     else 
    { 
      NSLog(@"failed"); 

    } 
+0

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

+0

je reçois problème lors de la mise à jour, pas dans l'insertion .. – Anand3777

+0

@ 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

Répondre

3

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.

+0

Bonne réponse ......! – preetam

+0

ouais..il travaille comme un charme ... Merci .. – Anand3777

1

Essayez d'enregistrer le nom de l'image dans la base de données et de l'image dans le dossier Documents en créant NSDocument dans NSFileManager.These sont singleton instances.You peut enregistrer l'image dans le dossier de la mémoire du téléphone qui est lié aux documents du applciation

exemple, vous pouvez trouver dans ce chemin Read/write file in Documents directory problem

Questions connexes