【问题标题】:Saving UIImage as binary to SQLite and retrieving it with imageWithData将 UIImage 以二进制形式保存到 SQLite 并使用 imageWithData 检索它
【发布时间】:2012-07-03 18:10:13
【问题描述】:

我在我的应用程序中将一些图像保存到 SQLite 数据库。我使用图形 SQLite 客户端访问了数据库,它正确保存了我的图像的二进制文件。问题在于从数据库中检索它。 这是它的样子:

保存

-(void)insertObject:(Object *)object
{
    const char* sqliteQuery = "INSERT INTO OBJECTS (OBJECTID, OBJECTIMAGE, OBJECTNAME) VALUES (?,?,?)";

sqlite3_stmt* statement;

if( sqlite3_prepare_v2(databaseHandle, sqliteQuery, -1, &statement, NULL) == SQLITE_OK )

{

    sqlite3_bind_text(statement, 1, [object.id UTF8String], -1, SQLITE_TRANSIENT);

    sqlite3_bind_blob(statement, 2, [object.imgData bytes], [object.imgData length], SQLITE_STATIC);

    sqlite3_bind_text(statement, 3, [object.name UTF8String], -1, SQLITE_TRANSIENT);

    sqlite3_step(statement);

}

else NSLog( @"SaveBody: Failed from sqlite3_prepare_v2. Error is:  %s", sqlite3_errmsg(databaseHandle) );

sqlite3_finalize(statement);
}

检索

-(Object *)retrieveObjectWithID:(NSString*)id
{

NSString* sqliteQuery = [NSString stringWithFormat:@"SELECT OBJECTIMAGE,OBJECTNAME FROM OBJECTS WHERE OBJECTID = '%@'", id];    
NSLog(@"sqlitequery: %@",sqliteQuery);
sqlite3_stmt* statement;

Object *object = [[Object alloc]init];

object.id = id;

if( sqlite3_prepare_v2(databaseHandle, [sqliteQuery UTF8String], -1, &statement, NULL) == SQLITE_OK )

{

    if( sqlite3_step(statement) == SQLITE_ROW )

    {

        NSUInteger length = sqlite3_column_bytes(statement, 1);

        object.imgData  = [NSData dataWithBytes:sqlite3_column_blob(statement, 1) length:length];
        object.name = [NSString stringWithFormat:@"%s",sqlite3_column_text(statement, 2)];

    }

}


// Finalize and close database.

sqlite3_finalize(statement);


return object;
}

这是对象

@interface Object : NSObject


@property(nonatomic,strong) NSString *id;
@property(nonatomic,strong) NSString *name;
@property(nonatomic,strong) NSData *imgData;

@end

【问题讨论】:

  • 您在检索数据时遇到了什么问题?
  • 它检索我一个微小的十六进制,这不允许我从构建一个 uiimage
  • 数据库表中“OBJECTIMAGE”字段的类型是什么?是 varchar 吗?
  • 这是创建表的语句:CREATE TABLE IF NOT EXISTS STORES (ID INTEGER PRIMARY KEY AUTOINCREMENT,STOREID TEXT, STOREIMG BLOB, STORENAME TEXT)

标签: ios sqlite uiimage nsdata


【解决方案1】:

请检查以下代码,

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 0) length:sqlite3_column_bytes(statement, 0)];

object.imgData = data;

而不是,

NSUInteger length = sqlite3_column_bytes(statement, 1);

        object.imgData  = [NSData dataWithBytes:sqlite3_column_blob(statement, 1) length:length];

【讨论】:

  • 它给了我同样的东西。而不是来自UIImagePNGRepresentation 的巨大十六进制,而是返回给我这个<50524f44 55544f53>
  • @LucasPereira:我发现了问题,您正在将图像名称分配给图像数据。我已经更新了上面的代码。您的数据在 OBJECTIMAGE 行中,因此您需要在 sqlite3_column_blob(statement, 0) 中使用 0 而不是 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2019-08-20
  • 1970-01-01
相关资源
最近更新 更多