3

我试图将 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);

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

批量插入到 iphone 上的 sqlite db

使用 gdb 或 NSLog 检查 [dictionary length] 的值会产生相同的结果:数据长度在 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 条目的最大大小范围内,并且我找不到可能会缩小我的数据大小的终端的信息。

4

2 回答 2

2

您是否检查过该绑定的返回类型?它可能会返回一个错误代码(在这种情况下,该语句仍可能会执行,只是不正确)。

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

于 2010-03-16T04:24:26.107 回答
0

我在这场疯狂的追逐中找到了肇事者……我取的是第 1 列的值而不是第 0 列,这是包含我的数据的实际列。我假设由于将值绑定到您的查询从第 1 列开始,从查询结果中检索列也将从 1 开始。我的错误。

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

于 2010-03-16T08:25:57.003 回答