【发布时间】:2011-01-27 23:12:14
【问题描述】:
我正在尝试将 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);
这实际上是我的代码中的一个 sn-p,我在另一个相关问题中发布了完整部分。
Bulk inserts into sqlite db on the iphone
使用 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 条目的最大大小范围内,并且我找不到任何可能将我的数据缩小到大小的终端的信息。
【问题讨论】:
-
我会检查 blob 的默认最大大小以及调整它的方法。那或者你正在某处缓冲数据,只有第一个块才能做到。
-
没有“默认”最大尺寸,文档中的 AFAICT ......只有最大尺寸。这是巨大的。比我要存储的要大得多。我正在检查绑定调用之前的值,并且 NSData 的实例在那之前是活动的并且有效。在绑定调用期间,将 SQLITE_TRANSIENT 作为参数传递应该会复制我交给它的数据......这样以后丢失的数据不应该成为问题。
-
这 10 个字节是什么?它实际上是对字典数据的截断吗?
标签: iphone objective-c sqlite nsdictionary nsdata