2

在我的应用程序中,我将多个存储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];
4

3 回答 3

2

将图像作为 blob 存储在数据库中是不好的过程。您需要将图像保存在缓存目录中,然后您需要将图像的路径保存在数据库中是好的。

于 2012-12-06T05:21:46.723 回答
2

当您将%@说明符与stringWithFormat:方法一起使用时,它会调用description相应参数的方法。对于对象,这将返回由andNSData包围的数据的十六进制表示。对于空对象,它将返回字符串,这就是插入数据库的内容。这可能不是您想要做的,因为这也会不必要地使您的图像数据的大小增加一倍。<>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 
于 2012-12-06T07:55:48.150 回答
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];

我希望这可以帮助你...

于 2012-12-06T05:27:53.857 回答