在我的应用程序中,我在database
中存储了多个images
。
其中我的数据库字段类型是 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];
当您将%@
说明符与 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
在数据库中将图像存储为 blob 是一个糟糕的过程。 您需要将图像保存在缓存目录中,然后您需要在数据库中保存图像的路径是好的。
bellow 是从数据库 try 检索图像的简单代码。
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];
我希望这对您有所帮助...