我已经设置了一个SQLite DB,它当前可以完美地读写NSString
。我还想将图像存储在数据库中,以后再调用它。我已经阅读了一些关于使用NSData
和编码图像的内容,但我不完全确定我想要做什么的语法。任何代码片段或示例将不胜感激。
我目前的流程如下:
UIImagePickerController
- >用户从照片中选择图像 - > selectedImage设置为UIImageView
的实例 - > 现在我想拍摄此图片并将其存储在数据库
我应该提到这个调用最终会被调用远程服务器取代。不确定这是否会对性能产生影响。
答案 0 :(得分:31)
您需要将UIImageView中托管的UIImage转换为二进制BLOB,以便在SQLite中存储。为此,您可以使用以下内容:
NSData *dataForImage = UIImagePNGRepresentation(cachedImage);
sqlite3_bind_blob(yourSavingSQLStatement, 2, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT);
这将生成图像的PNG表示形式,将其存储在NSData实例中,然后将NSData中的字节作为BLOB绑定到SQL查询中的第二个参数。如果您愿意,可以使用上面的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];
答案 1 :(得分:9)
一个选项(在SQL中工作时通常首选)是将图像写入系统上的文件并将路径(或其他类型的标识符)存储在数据库中。
答案 2 :(得分:9)
Apple的建议不是将BLOB存储在大于~2千字节的SQLite数据库中。
SQLite将数据库组织到页面中。每页大小为4千字节。当您从SQLite数据库文件中读取数据时,它会将这些页面加载到内部页面缓存中。在iPhone上我认为这个缓存默认大小为1兆字节。这使得读取相邻记录非常快,因为它们可能已经在页面缓存中。
当SQLite将数据库记录读入内存时,它会读取整个记录及其占用的所有页面。因此,如果您的记录包含BLOB,它可能会占用很多页面,您将从缓存中弹出现有页面并将其替换为BLOB记录的页面。
如果您只是扫描并加载所有BLOBS以对它们执行某些操作(例如显示它们),这并不是那么糟糕。但是如果你说你做了一个查询,你只想获得一些与BLOB在同一行的数据,那么这个查询会比记录不包含大BLOB要快得多。
因此,您至少应将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 statements调整页面缓存大小(如果您没有使用CoreData)。
答案 3 :(得分:2)
将图像写入SQLite DB
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 DB读取:
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];
答案 4 :(得分:0)
最佳做法是压缩映像并将其存储在数据库或文件系统中。如果您不关心图像的分辨率,您可以继续使用以下内容调整图像大小:
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
之后,您可以将UIImageJPEGRepresentation
用于值为“0”的jpeg图像,以实现最大压缩。或者您可以将UIImagePNGRepresentation
用于png图像
答案 5 :(得分:0)
首先应该在文件系统上写入图像。然后获取图像路径并将该图像路径(URL)存储为sqlite中的TEXT。