从iOS中的sqlite DB检索图像Blob值时从DB获取错误的值。我在DB中存储图像blob值,但是当我尝试获取该值时,它会给我额外的字节数。任何请帮助我。
使用以下方法插入值:
{
NSData * compressimagestream = UIImageJPEGRepresentation(imageview.image, 0.5);
sql = [NSString stringWithFormat:@"INSERT INTO IMAGE ('Image') VALUES ('%@')",compressimagestream];
sqlite3_stmt* statement;
if( sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, NULL) == SQLITE_OK )
{
sqlite3_bind_blob(statement, 1,[field2 bytes],[field2 length], SQLITE_TRANSIENT);
sqlite3_step(statement);
NSLog(@"Update %@",field2);
return TRUE;
}
else
{
NSLog(@"Update Fail");
return FALSE;
}
}
插入代码正常工作并存储我从UIImageJPEGRepresentation方法得到的字节数。
我从以下方法中检索值:
{
NSData *find = NULL;
sqlite3_stmt *statement;
sql = [NSString stringWithFormat:
@"select * from IMAGE"];
const char *query_stmt = [sql UTF8String];
if (sqlite3_prepare_v2(db,query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
if (sqlite3_step(statement) == SQLITE_ROW)
{
NSData *content = [[NSData alloc]
initWithBytes:sqlite3_column_blob(statement, 1)
length:sqlite3_column_bytes(statement, 1)];
find = content;
}
else{
NSLog(@"Not found");
}
sqlite3_reset(statement);
}
return find;
}
先谢谢,对不起我的英语。
答案 0 :(得分:0)
您插入数据库是不对的。你的SQL应该是:
sql = @"INSERT INTO IMAGE ('Image') VALUES (?)";
您必须使用?
占位符才能成功sqlite3_bind_blob
。我打赌,如果您检查了sqlite3_bind_blob
的返回代码,它目前不会返回SQLITE_OK
(可能sqlite3_step
的结果不是SQLITE_DONE
, )。
请务必检查所有SQLite调用的返回代码,如果没有SQLITE_OK
和SQLITE_DONE
(分别来自sqlite3_bind_blob
和sqlite3_step
),您应该记录sqlite3_errmsg(db)
,SQLite可能会提供一些信息性的错误消息。
同样,如果sqlite3_prepare_v2
失败,您需要记录错误消息,例如
NSLog(@"Update Fail: %s", sqlite3_errmsg(db));
顺便说一句,sqlite3_column_xxx()
函数使用从零开始的索引(与使用基于一个索引的sqlite3_bind_xxx()
调用不同)。所以你可能想要:
NSData *find = nil;
sqlite3_stmt *statement;
sql = @"select IMAGE from IMAGE";
if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, NULL) == SQLITE_OK)
{
int rc;
if ((rc = sqlite3_step(statement)) == SQLITE_ROW)
{
NSData *content = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 0)
length:sqlite3_column_bytes(statement, 0)];
find = content;
}
else if (rc == SQLITE_DONE) {
NSLog(@"Not found");
}
else {
NSLog(@"step error: %s", sqlite3_errmsg(db));
}
sqlite3_finalize(statement);
}
else
{
NSLog(@"Prepare failed: %s", sqlite3_errmsg(db));
}
return find;
另请注意,我正在呼叫sqlite3_finalize
,而不是sqlite3_reset
。