存储在sqlite数据库中时,NSData被截断

时间:2010-03-16 04:10:34

标签: iphone objective-c sqlite nsdictionary nsdata

我试图将NSMutableDictionaries存储为sqlite中的blob,首先通过NSPropertyListSerialization或NSKeyedArchiver将其转换为NSData。

当我存储blob时,NSData对象的长度为千(KB范围)。当我收回它时,它被截断为10个字节。当我通过SQLite浏览器检查数据库时,大部分数据都消失了(如果我将字典存储为NSPropertyListSerialization,我可以识别记录中的键,但字典的值已经消失)。无论我是使用NSPropertyListSerialization还是NSKeyedArchiver来序列化我的数据,都会发生这种情况。

NSMutableDictionary* item = [items objectAtIndex:i];
NSData *dictionary  = [NSKeyedArchiver archivedDataWithRootObject:item];
sqlite3_bind_blob(  compiledStatement, 5, [dictionary bytes], [dictionary length], SQLITE_TRANSIENT);

这实际上是我的代码中的一个片段,我在其他相关问题中发布了完整的部分。

Bulk inserts into sqlite db on the iphone

使用gdb或NSLog检查[字典长度]的值会产生相同的结果:数据长度在KB范围内。

当我检查以后检索数据时:

NSData* raw = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 1) length:sqlite3_column_bytes(compiledStatement, 1)];
[raw release];

检查[原始长度]只给我10个字节。对于我试图在此列中存储的每个数据实例都是如此,无论它们的起始大小如何,它们最终都会产生10个字节。我的检索查询没有错。我在命令行和SQL浏览器中运行它,并且我获得了正确的记录和列,但是存储在此特定列的记录中的数据不正确。

我的其他数据发生了什么变化?我使用sqlite3_bind_blob的方式有问题吗?我已经检查了sqlite文档以终止字符或最大大小限制。我的数据完全在blob条目的最大大小范围内,并且我找不到可能会将我的数据缩小到大小的终端信息。

2 个答案:

答案 0 :(得分:2)

你检查过那个绑定的返回类型吗?它可能会返回一个错误代码(该语句仍然可能在此事件中执行,但不正确)。

作为一种解决方法,您是否尝试过创建ZEROBLOB,然后使用SQLite documentation中描述的BLOB I / O例程写入它?这将是我在查看错误代码后尝试的下一步。

答案 1 :(得分:0)

我在这个狂野的追逐中找到了犯罪者...我正在取第1列的值而不是第0列,这是包含我数据的实际列。我假设因为查询的绑定值从第1列开始,从查询结果中检索列也将从1开始。我的错误。

每行10个字节实际上不是我的字典数据,而是我用来对结果进行排序的时间戳。