stocker des images dans la database sqlite

Voici mon code pour stocker des images dans la database sqlite. Quand je l'ai utilisé pour stocker des valeurs cela fonctionne et maintenant j'essaie de stocker des images dans la database sqlite. Je ne sais pas ce que je fais mal. J'ai déjà cherché et je ne peux pas get la réponse dont j'ai besoin. N'importe qui m'aide avec son code.

sqlite3 *database; dbName=@"dataTable.sqlite"; NSArray *documentpath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSSsortingng *documentdir=[documentpath objectAtIndex:0]; dbPath=[documentdir ssortingngByAppendingPathComponent:dbName]; sqlite3_stmt *comstackdStmt; if(sqlite3_open([dbPath UTF8Ssortingng], &database)==SQLITE_OK){ NSLog(@"Name:%@,Company:%@,URL:%@",model.personName,model.companyName,model.imgurl); const char *insertSQL="insert into Persons(PersonName,CompanyName,ImgUrl,PersonImage)values(?,?,?,?)"; if(sqlite3_prepare_v2(database,insertSQL, -1, &comstackdStmt, NULL)==SQLITE_OK){ sqlite3_bind_text(comstackdStmt,1,[model.personName UTF8Ssortingng],-1,SQLITE_TRANSIENT); sqlite3_bind_text(comstackdStmt,2,[model.companyName UTF8Ssortingng],-1,SQLITE_TRANSIENT); sqlite3_bind_text(comstackdStmt,3,[model.imgurl UTF8Ssortingng],-1,SQLITE_TRANSIENT); NSData *imageData=UIImagePNGRepresentation(imageView.image); sqlite3_bind_blob(comstackdStmt, 4, [imageData bytes], [imageData length], NULL); NSLog(@"Prepare"); sqlite3_step(comstackdStmt); }sqlite3_finalize(comstackdStmt); } 

MISE À JOUR: Merci à tout le monde .. J'ai effacé ce problème en posant une autre question d'ici .. stocker et récupérer l'image dans la database sqlite pour iphone Cela peut aider les autres.

J'ai répondu à une question similaire avec cette réponse: il est préférable d'utiliser CoreData à la place. Il vous sera beaucoup plus facile de travailler avec CoreDate au lieu de SQL. CoreData est à peu près une database SQL dans un bon emballage.

Si vous utilisez iOS 5, vous pouvez facilement append des images à la database sans avoir à vous soucier d'être BLOBS (Binary Large Object) en cochant "Autorise le stockage externe".

  const char *insertSQL="insert into Persons(PersonName,CompanyName,ImgUrl,PersonImage)values(?,?)" 

Vous avez 4 valeurs à insert dans votre table et seulement 2 espaces réservés pour les parameters. Corrige-les.

Heck I n'est pas un développeur iOS

vous venez d'append libSqlite3.dylib à FrameWork lié et Lilbraries et varibles de database déclarées dans le file .h

  //Database Variables @property (strong, nonatomic) NSSsortingng *databasePath; @property (nonatomic)sqlite3 *contactDB; @property (strong, nonatomic) IBOutlet UIButton *backbtn; @property (strong, nonatomic) IBOutlet UIButton *forwardbtn; 

Glissez et déposez UIImageView et nom à cela … j'ai déclaré comme imgView. Aller au file .m vous suffit de copyr et coller ce code

 int i=1; long long temp=0; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSSsortingng *docsDir; NSArray *dirPaths; // Get the documents directory dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); docsDir = dirPaths[0]; // Build the path to the database file _databasePath = [[NSSsortingng alloc] initWithSsortingng: [docsDir ssortingngByAppendingPathComponent: @"images.db"]]; //docsDir NSPathStore2 * @"/Users/gayathiridevi/Library/Application Support/iPhone Simulator/7.0.3/Applications/B5D4D2AF-C613-45F1-B414-829F38344C2A/Documents" 0x0895e160 NSFileManager *filemgr = [NSFileManager defaultManager]; if ([filemgr fileExistsAtPath: _databasePath ] == NO) { const char *dbpath = [_databasePath UTF8Ssortingng]; if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) { char *errMsg; const char *sql_stmt = "CREATE TABLE IF NOT EXISTS IMAGETB (ID INTEGER PRIMARY KEY AUTOINCREMENT,URL TEXT, CHECKSUM TEXT,IMAGE BLOB)"; if (sqlite3_exec(_contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) { NSLog( @"User table Not Created Error: %s", errMsg); } else { NSLog( @"User table Created: "); } sqlite3_close(_contactDB); } else { NSLog( @"DB Not Created"); } } [self saveImage]; [self showImage]; } - (void)saveImage { sqlite3_stmt *statement; const char *dbpath = [_databasePath UTF8Ssortingng]; if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) { NSSsortingng *insertSQL=@"INSERT INTO IMAGETB(URL,image) VALUES(?,?)"; if(sqlite3_prepare_v2(_contactDB, [insertSQL cSsortingngUsingEncoding:NSUTF8SsortingngEncoding], -1, &statement, NULL)== SQLITE_OK) { //NSSsortingng *url =@"http://img.iosberry.com/iphone/photo.jpg"; //NSSsortingng *url =@"http://img.iosberry.com/iphone/Junonia_lemonias_DSF_upper_by_Kadavoor.JPG"; // NSSsortingng *url =@"http://img.iosberry.com/iphone/Tibia_insulaechorab.jpg"; NSSsortingng *url =@"http://img.iosberry.com/iphone/PNG_transparency_demonstration_2.png/280px-PNG_transparency_demonstration_2.png"; UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithSsortingng:url]]]; NSData *imageData=UIImagePNGRepresentation(image); sqlite3_bind_text(statement,1, [url UTF8Ssortingng], -1, SQLITE_TRANSIENT); sqlite3_bind_blob(statement, 2, [imageData bytes], [imageData length], SQLITE_TRANSIENT); NSLog(@"Length from internet : %lu", (unsigned long)[imageData length]); } if (sqlite3_step(statement) == SQLITE_DONE) { NSLog( @"Insert into row id %lld",(sqlite3_last_insert_rowid(_contactDB))); temp =(sqlite3_last_insert_rowid(_contactDB)); } else { NSLog( @"Error IN INSERT" ); } sqlite3_finalize(statement); sqlite3_close(_contactDB); } } - (void)showImage { sqlite3_stmt *statement; const char *dbpath = [_databasePath UTF8Ssortingng]; if(sqlite3_open(dbpath,&_contactDB)==SQLITE_OK) { NSSsortingng *insertSQL = [NSSsortingng ssortingngWithFormat:@"Select IMAGE FROM IMAGETB WHERE ID = %d",i]; if(sqlite3_prepare_v2(_contactDB,[insertSQL cSsortingngUsingEncoding:NSUTF8SsortingngEncoding], -1, &statement, NULL) == SQLITE_OK) { while(sqlite3_step(statement) == SQLITE_ROW) { int length = sqlite3_column_bytes(statement, 0); NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(statement, 0) length:length]; NSLog(@"Length from db : %lu", (unsigned long)[imageData length]); if(imageData == nil) NSLog(@"No image found."); else _imgView.image = [UIImage imageWithData:imageData]; NSLog(@"image found."); } } sqlite3_finalize(statement); } sqlite3_close(_contactDB); } -(IBAction)backBtn:(id)sender { if (i<=1) {} else{ i=i-1; [self showImage]; } } -(IBAction)forwardBtn:(id)sender { if(i==temp){} else{ i=i+1; [self showImage]; } } 

Vous devriez vérifier les valeurs de return de bind_text et bind_blob et l'étape-appel, imprimer un message d'erreur quand ils échouent.