在我的应用程序中,我在images
中存储了多个database
我的数据库字段类型是blob。
存储image
数据的效果很好,但是当我使用以下代码从数据库中获取image
data
时
NSData *photodata=[[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStmt, 12) length:sqlite3_column_bytes(compiledStmt, 12)];
但该字段包含它返回的空数据< 3c3e>代替零值。
我使用以下查询
strQuery_DB = [NSString stringWithFormat:@"update tbl_project_review set answer ='%@',comment ='%@',photodata='%@' where prjid=%d",temp,escapedStr1,tempdata,prjid];
答案 0 :(得分:2)
在DB中将图像存储为blob是错误的过程。你需要在缓存目录中保存图像,然后你需要在DB中保存图像路径是好的。
答案 1 :(得分: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 :(得分:0)
下面是从数据库中检索图像的简单代码试试..
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];
我希望这可以帮助你...