从iOS中的Sqlite DB检索时获取错误的图像值

时间:2014-01-03 05:34:46

标签: ios iphone database sqlite

从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;
 }

先谢谢,对不起我的英语。

1 个答案:

答案 0 :(得分:0)

您插入数据库是不对的。你的SQL应该是:

sql = @"INSERT INTO IMAGE ('Image') VALUES (?)";

您必须使用?占位符才能成功sqlite3_bind_blob。我打赌,如果您检查了sqlite3_bind_blob的返回代码,它目前不会返回SQLITE_OK(可能sqlite3_step的结果不是SQLITE_DONE, )。

请务必检查所有SQLite调用的返回代码,如果没有SQLITE_OKSQLITE_DONE(分别来自sqlite3_bind_blobsqlite3_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