2011-04-19 49 views
0

我的iPhone应用程序使用SQLite数据库来存储数据。我有一张桌子,上面有一个blob列,用于存储我的图像。如何将NSImage序列化为sql脚本以便将其导入blob列中?

当我做一个更新,我不想覆盖用户的数据库,我想执行一些SQL脚本并注入新的数据,如果需要的话。

我有一个为Mac制作的应用程序应用程序,该应用程序应该能够在iPhone上运行sql脚本。

我的图像存储为NSImages在我的应用程序,但我有问题时,我想导出数据为SQL脚本(简单的文本文件)。

我的文件应该有这样几行:

Insert into Images(imageData) values (___IMAGE1_DATA___); 
Insert into Images(imageData) values (___IMAGE2_DATA___); 
Insert into Images(imageData) values (___IMAGE3_DATA___); 

的问题是我怎么可以序列图像数据到我的sql脚本,以便正确地将数据导入到BLOB列?

+0

看看[SQLite中的BLOB?](http://stackoverflow.com/questions/4981154/blob-in-sqlite) – 2011-04-19 15:28:49

+0

我存储图像的列是Blob类型。 – 2011-04-26 06:59:20

回答

0

我找到了一个解决方案,将图像序列化为一个sql脚本,然后将它们插入db(blob列)。

我从这样的图像提取NSData NSData *thumbailData = [thumbnail TIFFRepresentation];(感谢尼克)。

我解压缩NSData后,我使用下面的方法将其转换为十六进制字符串。我将它添加到NSData的一个类别。

- (NSString*) hexString { 
    NSMutableString *stringBuffer = [NSMutableString 
            stringWithCapacity:([self length] * 2)]; 
    const unsigned char *dataBuffer = [self bytes]; 
    int i; 

    for (i = 0; i < [self length]; ++i) 
     [stringBuffer appendFormat:@"%02x", (unsigned long)dataBuffer[ i ]]; 

    return [[stringBuffer copy] autorelease]; 
} 

NSString *hexRepresentation = [thumbnailData hexString]; 

的hexRepresentation看上去象这样:

4d4d002a00005a48fafafafff8f8f8fff8f8f8fff9f9f9fff8f8f8fff8f8f8 ...

为了序列图像的hexRepresentation我创建了一个SQL脚本,象下面这样:

INSERT INTO Thumbnails (Picture_uid, Thumbnail) Values(10, x'4d4d002a00005a48fafafafff8f8f8fff8f8f8fff9f9f9fff8f8f8fff8f8f8 … ‘) ; 

x'数据'告诉db它将以十六进制格式接收信息,并且它会知道如何处理它。

此解决方案的问题之一是它会使脚本大小加倍。如果你将有一个200kb的图像,脚本将有400kb,但在数据库中的图像将是200kb。

对我来说,这是一个很好的解决方案,使用sql脚本更新我的数据库而无需编写任何代码。

0

您需要使用UIImage的CGImage方法获取底层CGImage对象。再看看在CGImage参考:

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGImage/Reference/reference.html

然后用CGContextRef对象绘制图像,并获得像素数据。

有StackOverflow上一个很好的例子:

How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?

您还可以使用UIImagePNGRepresentationUIImagePNGRepresentation功能,即直接返回NSData对象,如果这些格式适合你。这将会更简单。

然后使用bytes方法NSData有一个指向图像数据的指针(const void *)。

1

您可以使用NSImage的TIFFRepresentation来获取NSData表示。

其实我会将图像保存到磁盘并引用那些只从你的sqlite数据库。这可以提高性能,当你的图像往往很大。

+0

嘿尼克,谢谢你的答案。它帮助我为我的问题找到解决方案。 – 2011-04-26 06:59:59

相关问题