2011-04-19 46 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

相關問題