我的iphone应用程序使用SQLite数据库来存储数据。我有一个带有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 :(得分:1)
您可以使用NSImage的TIFFRepresentation来获取NSData表示。
实际上我会将图像保存到磁盘并仅从您的sqlite数据库中引用它们。当您的图片往往很大时,这可以提高性能。
答案 1 :(得分:0)
您需要使用UIImage的CGImage
方法获取基础CGImage
对象。然后看一下CGImage参考:
然后使用CGContextRef
对象绘制图像,并获取像素数据。
StackOverflow上有一个很好的例子:
How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?
如果这些格式适合您,您还可以使用直接返回UIImagePNGRepresentation
对象的UIImagePNGRepresentation
或NSData
函数。这将简单得多。
然后使用bytes
的{{1}}方法指定图像数据(NSData
)。
答案 2 :(得分:0)
我找到了一个解决方案,将图像序列化为sql脚本,然后将它们插入db(blob列)。
我从像NSData *thumbailData = [thumbnail TIFFRepresentation];
这样的图像中提取NSData(感谢Nick)。
在我提取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'数据'告诉数据库它将以十六进制格式接收信息,并且知道如何处理它。
此解决方案的一个问题是它会使脚本的大小加倍。如果你有200kb的图像,脚本将有400kb,但在db中,图像将是200kb。
对我来说,这是一个很好的解决方案,可以使用sql脚本更新我的数据库,而无需编写任何代码。