NSData 返回空问题



在我的应用程序中,我在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];

我希望这对您有所帮助...

相关内容

  • 没有找到相关文章

最新更新