我试图将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条目的最大大小范围内,并且我找不到可能会将我的数据缩小到大小的终端信息。
答案 0 :(得分:2)
你检查过那个绑定的返回类型吗?它可能会返回一个错误代码(该语句仍然可能在此事件中执行,但不正确)。
作为一种解决方法,您是否尝试过创建ZEROBLOB,然后使用SQLite documentation中描述的BLOB I / O例程写入它?这将是我在查看错误代码后尝试的下一步。
答案 1 :(得分:0)
我在这个狂野的追逐中找到了犯罪者...我正在取第1列的值而不是第0列,这是包含我数据的实际列。我假设因为查询的绑定值从第1列开始,从查询结果中检索列也将从1开始。我的错误。
每行10个字节实际上不是我的字典数据,而是我用来对结果进行排序的时间戳。