在Ultralite数据库iPhone中插入二进制数据时出错

时间:2011-07-12 11:14:53

标签: iphone

您好我正在写一个iphone应用程序,我需要存储二进制数据,即; Ultralite数据库中的图像。 我为此目的使用以下代码。

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"file_name" ofType:@"png"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSUInteger len = [data length];
ul_binary *byteData = (ul_binary*)malloc(len);
memcpy(byteData, [data bytes], len);

ULTable *table = connection->OpenTable("NAMES");
if(table->InsertBegin()){
    table->SetInt(1, (maxId+1));
    table->SetString(2, [name UTF8String]);
    table->SetBinary(3, byteData);
    table->Insert();
    table->Close();
    connection->Commit();
}

此代码在行::

上给出错误'EXC_BAD_ERROR'
table->SetBinary(3, byteData);

如果我对此行发表评论,此代码可以正常工作。

任何帮助将不胜感激! 感谢

1 个答案:

答案 0 :(得分:0)

ul_binary的定义是:

typedef struct ul_binary {
    /// The number of bytes in the value.
    ul_length       len;
    /// The actual data to be set (for insert) or that was fetched (for select).
    ul_byte     data[ MAX_UL_BINARY ];
} ul_binary, * p_ul_binary;

所以这是一个结构。只需像您一样执行memcpy,您也会覆盖len字段,并且每个事情都会搞砸。所以这就是你应该怎么做的(据我所知):

ul_binary *byteData = (ul_binary *)malloc(sizeof(ul_binary));
memcpy(&byteData->data, [data bytes], len);
byteData->len = len;

在尝试分配内存之前,还需要检查len <= MAX_UL_BINARY。不要忘记free(byteData);