2012-12-06 56 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]; 

我希望这会帮助你...