2012-12-06 55 views
2

在我的應用程序中,我在database中存儲了多個images
其中我的數據庫字段類型是blob。NSData返回空值問題

存放image數據的效果很好,但是當我使用下面的代碼

NSData *photodata=[[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStmt, 12) length:sqlite3_column_bytes(compiledStmt, 12)]; 

從數據庫中獲得imagedata但字段包含空數據返回我< 3c3e>代替空值。
我用下面的查詢

strQuery_DB = [NSString stringWithFormat:@"update tbl_project_review set answer ='%@',comment ='%@',photodata='%@' where prjid=%d",temp,escapedStr1,tempdata,prjid]; 
+0

'sqlite3'支持參數化查詢,不是嗎? – dreamlax

+0

當我將空數據存儲在blob字段中時,它就像<>一樣存儲,所以我如何刪除這些括號中的空值 –

回答

2

當您使用%@符與stringWithFormat:方法,它調用description各自論證的方法。對於NSData對象,這將返回由<>包圍的數據的十六進制表示形式。對於空的NSData對象,它將返回字符串<>,這是插入到數據庫中的內容。這可能不是你想要做的,因爲這也會使圖像數據的大小倍增不必要。

您應該使用參數化的查詢功能,例如sqlite_bind_blob。這將使處理數據輸入更容易。基本上,您需要將您的更新查詢更改爲以下內容(添加相應的錯誤檢查等):

const char sql[] = "update tbl_project_review set answer = ?, comment = ?, photodata = ? where prjid = ?"; 
sqlite3_stmt *stmt = NULL; 
sqlite3_prepare_v2(db, sql, sizeof sql, &stmt, NULL); 

sqlite3_bind_text(stmt, 1, [tmp UTF8String], -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(stmt, 2, [escapedStr1 UTF8String], -1, SQLITE_TRANSIENT); 
sqlite3_bind_blob(stmt, 3, [tempdata bytes], [tempdata length], SQLITE_TRANSIENT); 
sqlite3_bind_int(stmt, 4, prjid); 

sqlite3_step(stmt); // check for SQLITE_DONE 
2

存儲圖像作爲二進制大對象DB是壞的程序插入的數據。你需要將圖像保存在你的緩存目錄中,然後你需要保存圖像在DB中的路徑是好的。

0

波紋管是從數據庫中retrive圖像簡單的代碼嘗試..

   NSString *imgurl=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)]; 
       int length = sqlite3_column_bytes(compiledStatement, 4); 
//    NSData *data  = [NSData dataWithBytes:sqlite3_column_blob(compiledStatement, 4) length:length]; 
       NSString *imageString=[NSString stringWithCharacters:sqlite3_column_blob(compiledStatement, 4) length:length]; 
       UIImage *personImage=[UIImage imageNamed:imageString]; 

我希望這會幫助你...