NSData返回Null问题

时间:2012-12-06 05:15:04

标签: iphone sqlite null nsdata

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

3 个答案:

答案 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];

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