2011-03-10 105 views
1

我在google搜索了很多,但无法获得所需的答案。我正在从图片库中选择照片,并且希望将其存储在我的应用程序中。如果我必须将它存储在数据库中(作为BLOB),那么我必须输入文件的名称(我没有从画廊中选择该文件)。我可以将它存储在其他地方吗?请帮忙。我从很长一段时间里陷入了这个困境。我需要提取图像并在地图标注视图中显示它。从商店中选择的应用程序中的iphone商店图像

我使用下面的代码,从图库中选择照片并插入到数据库

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)dictionary { 
     [picker dismissModalViewControllerAnimated:YES]; 
    tempImg.image = image; 
    NSData *imgData = UIImagePNGRepresentation(tempImg.image); 
     NSLog(@"the img data %@",imgData); 

sql = [NSString stringWithFormat:@"update latlng set image = '%@' where placeName = '%@'",imgData,pName.text]; 

下面的代码excuting上述

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
     const char *sqlStatement; 
     sqlStatement = [sql UTF8String];; 

     sqlite3_stmt *compiledStatement; 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
     { 
      if (sqlite3_step(compiledStatement)) 
      { 
       NSLog(@"YES"); 
      } 
     } 
     else 
     { 
      printf("could not prepare statemnt: %s\n", sqlite3_errmsg(database)); 
     } 
     sqlite3_finalize(compiledStatement); 

    }sqlite3_close(database); 

下面的代码从数据库中提取提到的SQL语句

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 5) length:sqlite3_column_bytes(compiledStatement, 5)]; 

以下代码在标注中显示图像

UIImageView *mapImg = [[UIImageView alloc] initWithImage [UIImageimageWithData:imgData]]; 
pinView.leftCalloutAccessoryView = mapImg; 

回答

2

转换为照片库的NSData获得的图像,然后将其保存在数据库中的Blob,所以你可以很容易地从数据库中检索NSData的时候你永远需要的。

NSData *image1Data = UIImagePNGRepresentation(image1.image); 
sqlite3_bind_blob(init_statement, 1, [image1Data bytes], [image1Data length], NULL); 

image1是ImageView的显示图片的图片库。

一切顺利。

+0

感谢您的回答。我现在尝试了以上。但是,转换到nsdata时,应用程序崩溃。我在那里放了一个nslog并试了一下。它显示图像被加密但它不停止。然后崩溃。 plz帮助。 – Droidme 2011-03-10 05:25:24

+0

你可以发布你的代码和崩溃日志吗? – Warrior 2011-03-10 05:27:15

+0

上述代码适用于少数图片。但少数它是剂量。这是否由于尺寸?我编辑了我的问题的代码 – Droidme 2011-03-10 05:34:21

0

您可以使用这一功能,你的应用程序检索路径写入的目录:

NSString *directory = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

有访问该目录中,包括的NSData的writeToFile:方法,该的NSFileManager类中,NSFileHandle类的各种方式,并即使是C stdio功能。

+0

谢谢失范。你能告诉我如何将图像存储在我从图像库获得的目录中。 – Droidme 2011-03-10 05:27:12

+0

您可以使用'UIImageJPEGRepresentation'将其转换为NSData,并使用NSData的'writeToFile'将其写出,或者您可以使用['CGImageDestination'](http://developer.apple.com/library/ios/documentation/GraphicsImaging/概念/ ImageIOGuide/ikpg_dest/ikpg_dest.html#// apple_ref/DOC/UID/TP40005462-CH219-SW3)。或者也可能有其他方法。 – Anomie 2011-03-10 12:02:26

0

在我来说,我搜索谷歌很多,然后finaly了解决方案,下面的代码工作对我的,我希望它为你工作

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 


NSLog(@"info: %@",info); 

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirec = [paths objectAtIndex:0]; 
NSString *imgePath = [documentsDirec stringByAppendingPathComponent:@"note.sqlite"]; 

if(sqlite3_open([imgePath UTF8String], &database) == SQLITE_OK){ 

    const char *sql = "insert into images (images) values (?)"; 
    if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) == SQLITE_OK){ 
     UIImage *edtedImae = [info objectForKey:UIImagePickerControllerOriginalImage]; 
     NSData *dataForImage = UIImagePNGRepresentation(edtedImae); 
     sqlite3_bind_blob(addStmt, 1, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT); 
    } 
    if(sqlite3_step(addStmt) != SQLITE_DONE){ 

     NSLog(@"error %s",sqlite3_errmsg(database)); 
    } 
    else { 
     NSLog(@"Insert row Id = %d",sqlite3_last_insert_rowid(database)); 
    } 
    sqlite3_finalize(addStmt); 

    } 
    sqlite3_close(database);    
    [picker dismissModalViewControllerAnimated:YES]; 
} 

谢谢