读取和写入图像到SQLite数据库的iPhone使用

我已经build立了一个SQLite数据库,当前读写NSString s是完美的。 我也想将图像存储在数据库中,稍后再调用它。 我已经读了一些使用NSData和编码图像,但我不完全知道什么语法是我想要做的。 任何代码片段或例子将不胜感激。

我当前的过程是这样的: UIImagePickerController – >用户从照片中select图像 – > chosenImage被设置为UIImageView实例 – > 现在我想把这个图像,并将其存储在数据库

我应该提到这个调用最终会被一个远程服务器调用所取代。 不知道这是否会影响性能。

一种select(在SQL中工作时通常首选)是将图像写入系统中的文件,并将path(或其他types的标识符)存储在数据库中。

你需要将你的UIImageView中托pipe的UIImage转换成一个二进制的BLOB存储在SQLite中。 要做到这一点,您可以使用以下内容:

 NSData *dataForImage = UIImagePNGRepresentation(cachedImage); sqlite3_bind_blob(yourSavingSQLStatement, 2, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT); 

这将生成图像的PNG表示,将其存储在NSData实例中,然后将NSData中的字节绑定为SQL查询中第二个参数的BLOB。 如果你喜欢,使用上面的UIImageJPEGRepresentation以这种格式存储。 您将需要有一个BLOB列添加到您的SQLite数据库中适当的表。

要检索这个图像,您可以使用以下内容:

 NSData *dataForCachedImage = [[NSData alloc] initWithBytes:sqlite3_column_blob(yourLoadingSQLStatement, 2) length: sqlite3_column_bytes(yourLoadingSQLStatement, 2)]; self.cachedImage = [UIImage imageWithData:dataForCachedImage]; [dataForCachedImage release]; 

Applebuild议不要将BLOB存储在大于〜2千字节的SQLite数据库中。

SQLite将数据库组织成页面。 每页是4千字节的大小。 从SQLite数据库文件中读取数据时,会将这些页面加载到内部页面caching中。 在iPhone上,我认为这个caching默认为1兆字节大小。 这使得读取相邻logging的速度非常快,因为它们可能已经在页面caching中了。

当SQLite将数据库logging读入内存时,它会读取整个logging以及它占据的所有页面。 因此,如果您的logging包含BLOB,则它可能占用很多页面,您将从caching中popup现有页面,并将其replace为BLOBlogging的页面。

如果你只是扫描并加载所有的BLOBS来做一些事情(例如显示),这并不是那么糟糕。 但是,如果说你做了一个查询,你只是想获得与BLOB在同一行的一些数据,这个查询将比如果logging不包含大的BLOB慢得多。

所以至less应该将BLOB数据存储在一个单独的表中。 例如:

 CREATE TABLE blobs ( id INTEGER PRIMARY KEY, data BLOB ); CREATE TABLE photos ( id INTEGER PRIMARY KEY, name TEXT, blob_id INTEGER, FOREIGN KEY(blob_id) REFERENCES blobs(id) ); 

或者更好的办法是将BLOB数据存储为SQLite数据库以外的文件。

请注意,可以使用SQL PRAGMA语句来调整页面caching大小(如果您不使用CoreData)。

写图像到SQLite数据库

 if(myImage != nil){ NSData *imgData = UIImagePNGRepresentation(myImage); sqlite3_bind_blob(update_stmtement, 6, [imgData bytes], [imgData length], NULL); } else { sqlite3_bind_blob(update_stmtement, 6, nil, -1, NULL); } 

从SQLite数据库读取:

 NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(init_statement, 6) length:sqlite3_column_bytes(init_statement, 6)]; if(data == nil) NSLog(@"No image found."); else self.pictureImage = [UIImage imageWithData:data]; 

你应该先在文件系统上写图像。 然后获取图像path并将该图像path(URL)作为TEXT存储在sqlite中。

最好的做法是压缩图像并将其存储在数据库或文件系统中。 如果您不关心图像的分辨率,可以继续使用,甚至可以使用以下命令调整图像的大小:

  UIGraphicsBeginImageContext(newSize); [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

之后,您可以使用UIImageJPEGRepresentation为值为“0”的JPEG图像进行最大压缩。 或者你可以使用UIImagePNGRepresentation为PNG图像