2012-02-24 74 views
0

問題: - 我正在使用FMDatabase類來存儲數據庫中的數據和從數據庫訪問數據。在一張表中,我使用Blob數據類型來存儲Image。 方式:Feching圖像形式sqlite(使用FMDatabase類)

 UIImage *img = [UIImage imageNamed:@"image.png"]; 
    NSData *data = UIImagePNGRepresentation(img); 
    [fmdbase executeUpdate:[NSString stringWithFormat: @"Insert into tblComm('%d,%@','%@')",cID,cmmentsString,data...]]; 

並獲得這樣的數據,

 commentsText.text = [records stringForColumn:@"comments"]; 
    // NSData *data = [records stringForColumn:@"photo"]; 
     NSData *data = [records dataForColumn:@"photo"]; 
    UIImage *img = [UIImage imageWithData:data]; 

,但數據是不準確的格式和不顯示圖像,請幫幫忙?

+1

解決方案:像這樣:Create table tblComm(commID integer primary key autoincrement,comm text,photo text);和使用BASE64Encoding使用FMDatabase類插入值,請從此鏈接下載代碼[鏈接](http://imthi.com/blog/programming/iphone-sdk-base64-encode-decode.php)並編寫像這樣的代碼://將nsdata轉換爲nsstring:UIImage * img = [UIImage imageNamed:@「image.png」]; data1 = UIImagePNGRepresentation(img); [Base64初始化]; NSString * enString = [Base64 encode:data1]; – 2012-02-29 07:43:24

回答

1

一個選項(在SQL中工作時通常首選)是將圖像寫入系統中的文件並將路徑(或其他類型的標識符)存儲在數據庫中。

一些內部的sqlite如何存儲記錄&爲什麼它可能不會優化存儲圖像。 Apple建議不要將BLOB存儲在大於〜2千字節的SQLite數據庫中。

SQLite將數據庫組織成頁面。每頁大小爲4千字節。當你從SQLite數據庫文件讀取數據時,它會將這些頁面加載到內部頁面緩存中。在iPhone上,我認爲這個緩存默認大小爲1兆字節。這使得讀取相鄰記錄的速度非常快,因爲它們可能已經在頁面緩存中了。

當SQLite將數據庫記錄讀入內存時,它會讀取整個記錄以及它佔據的所有頁面。因此,如果您的記錄包含BLOB,則它可能佔用很多頁面,並且您將從緩存中彈出現有頁面,並將其替換爲BLOB記錄的頁面。

這並不是很糟糕,如果你只是掃描並加載所有的BLOBS來處理它們(例如顯示它們)。但是如果說你做了一個查詢,你只想獲得與BLOB在同一行的一些數據,那麼這個查詢將比如果該記錄不包含大BLOB要慢得多。所以至少應該將BLOB數據存儲在單獨的表中。或者更好的是,我的第一個建議是將BLOB數據存儲爲SQLite數據庫之外的文件。

請注意,可以使用SQL PRAGMA statements(如果您不使用CoreData)調整頁面緩存大小。