我已经设置了一个SQLite数据库,目前读取和写入完美NSStrings。我也想存储在数据库中的图像和后来回忆它。我已经阅读了关于使用NSData和编码图像有点,但我不能完全肯定的语法是什么,我想做的事情。任何代码段或示例,将不胜感激。

我的当前过程是这样的: UIImagePickerController - >用户从照片]选择图像 - > chosenImage设置为UIImageView的实例 - > 立即我想借此图像,并将其存储在DB

我应该提到这个呼叫将最终与到远程服务器的呼叫代替。不知道这是否有差别至于性能也越高。

有帮助吗?

解决方案

一种选择(和在SQL工作时通常优选)是将图像写入系统上的一个文件,并存储在数据库中的路径(或一些其他类型的标识符)。

其他提示

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

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

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

要检索此图像,则可以使用以下内容:

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

Apple的建议是不BLOB的存储在SQLite数据库是比〜2千字节大。

SQLite的组织数据库成页面。每个页面大小为4K字节。当你从SQLite数据库文件中读取数据,它加载这些页面到内部页面缓存。在iPhone上,我认为这个缓存默认大小1兆字节。这使得读取相邻的记录非常快,因为他们很可能是在页面缓存中了。

在读取的SQLite数据库记录到内存中读取整个记录和所有其占领的页面。所以,如果你的记录包含BLOB,它可能会占用大量的页面,你会从缓存中弹出现有的网页,并与您的BLOB记录的页面替换它们。

这是没有那么糟糕,如果你只是通过扫描并加载所有您的blob做他们的东西(显示他们的例子)。但是,如果说你没有,你只是想获得一些数据,同一行的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) );

或者更好的是,存储SQLite数据库外部的BLOB数据作为文件。

请注意,这可能可以调整与 SQL语句PRAGMA页面缓存大小(如果你不使用CoreData)。

写入图像对于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];   

您应该先写文件系统上的图像。然后取图像路径和存储图像路径(URL),如源码TEXT。

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

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

这后,可以使用JPEG图像UIImageJPEGRepresentation与最大压缩一个“0”值。或者你可以使用UIImagePNGRepresentation PNG图像

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top