Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSData存储在sqlite数据库中时被截断_Iphone_Objective C_Sqlite_Nsdictionary_Nsdata - Fatal编程技术网

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

Iphone NSData存储在sqlite数据库中时被截断,iphone,objective-c,sqlite,nsdictionary,nsdata,Iphone,Objective C,Sqlite,Nsdictionary,Nsdata,我试图将NSMutableDictionary存储为sqlite中的blob,方法是首先通过NSPropertyListSerialization或NSKeyedArchiver将其转换为NSData 存储blob时,NSData对象的长度为数千(KB范围)。当我取回它时,它被截断为10个字节。当我通过SQLite浏览器检查DB时,大部分数据都消失了(如果我将字典存储为NSPropertyListSerialization,我可以识别记录中的键,但字典的值消失了)。无论使用NSPropertyL

我试图将NSMutableDictionary存储为sqlite中的blob,方法是首先通过NSPropertyListSerialization或NSKeyedArchiver将其转换为NSData

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

NSMutableDictionary* item = [items objectAtIndex:i];
NSData *dictionary  = [NSKeyedArchiver archivedDataWithRootObject:item];
sqlite3_bind_blob(  compiledStatement, 5, [dictionary bytes], [dictionary length], SQLITE_TRANSIENT);
这实际上是我代码中的一个片段,我在另一个相关问题中发布了完整的部分

使用gdb或NSLog检查[dictionary length]的值会得到相同的结果:数据长度在KB范围内

当我选中“稍后检索数据”时:

NSData* raw = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 1) length:sqlite3_column_bytes(compiledStatement, 1)];
[raw release];
检查[raw length]只得到10个字节。这对于我试图存储在本专栏中的每个数据实例都是正确的,无论它们的起始大小如何,最后都是10个字节。我的检索查询没有问题。我在命令行和SQL浏览器中运行了它,得到了正确的记录和列,但存储在该特定列的记录中的数据不正确


我剩下的数据怎么了?我使用sqlite3\u bind\u blob的方式是否有问题?我已经检查了sqlite文档中的终止字符或最大大小限制。我的数据完全在blob条目的最大大小内,并且我找不到可能将我的数据剪切到该大小的终端的任何信息。

您是否检查了该绑定的返回类型?它可能返回错误代码(在该事件中,该语句仍可能执行,只是执行不正确)


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

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


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

我会检查默认最大大小的blob以及调整它的方法。或者你正在某个地方缓冲数据,只有第一个数据块可以缓冲。没有来自文档的“默认”最大大小AFAICT。。。只要一个最大尺寸。这是巨大的。比我想储存的要大得多。在bind调用之前,我正在检查这些值,并且NSData的实例在此之前是活动的和有效的。在bind调用期间,将SQLITE_TRANSIENT作为参数传递应该是复制我传递给它的数据。。。所以以后丢失的数据不应该成为问题。10字节中有什么?它实际上是字典数据的截断吗?它返回SQLITE_OK。我会给blob I/o一个机会,但在不进行增量存储的情况下,将blob提交到数据库是一种非常迂回的方式。此外,在更彻底地检查此方法后,我担心开销。我必须先插入记录,然后通过获取blob句柄立即更新它?我想在zeroblob存在之前写入它是没有意义的,但这将占用我事务的更多时间,我非常关心性能。zeroblob只是一个占位符——在您写入实际的blob数据之前,它不会占用任何空间(或性能)。所以不要担心表现,除非有问题。我在这场疯狂的追逐中找到了肇事者。。。我取的是第1列的值,而不是第0列,第0列是包含我的数据的实际列。我假设,由于将值绑定到查询是从第1列开始的,所以从查询结果检索列也将从第1列开始。我的错误。无论如何,谢谢你的建议。知道我可以使用zeroblob而不用担心性能可能在将来的某个时候会很有用。