如何在SQLite中逐段更新blob?

时间:2009-03-24 08:24:50

标签: sqlite blob

我在SQLite应用程序中有大量blob,需要以分段方式更新这些blob的小段。有点像“用数据D更新blob B的字节X到Y”,这可以在其他使用Blob操作函数的数据库中完成,但我找不到像SQLite这样的东西,我卡住了吗?或者SQLite有办法操纵Blob吗?

感谢。

3 个答案:

答案 0 :(得分:7)

这不是你问题的直接答案,但我有一些使用随机访问SQLite中(大)blob的经验,如果可以,我建议你不要使用它。原因如下:

Blob完全破坏了SQL查询格式。如果你的blob数据需要任何类型的处理,它肯定在某些时候需要过滤。无论你采用什么机制来处理SQL中的过滤都没有用。

处理包含在与原始文件中的二进制数据相对的数据库中的二进制blob限制了您的选项。您将无法从多个进程中同时随机读取和写入数据,这对于文件是可能的。您不能使用任何处理此数据的工具,只提供文件I / O接口。您不能截断或调整blob的大小。文件更加通用。

将所有内容都包含在一个文件中似乎很方便,因为它简化了备份和传输,但使用blob的痛苦根本不值得。

作为您的律师,我建议您将blob作为原始文件写入文件系统,并仅在数据库中存储对文件名的引用。如果你的斑点相当小并且保证不会长大,请忘记我的建议。

答案 1 :(得分:4)

SQLite 3.x通过sqlite3_blob_write函数支持此功能。

int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset)

请注意,此函数是作为SQLite 3 C / C ++ API的一部分提供的。您需要直接对此进行编程才能使用它。

如果您正在使用其他更高级别的包装器,例如System.Data.SQLite,那么上次我看,您将无法访问此功能。

答案 2 :(得分:3)

我非常同意paniq所说的一切。使用BLOB可以大大限制您的选择。

如果您使用的是System.Data.SQLite,则无法真正支持BLOB。这就是我编写自己的类来处理它们的原因。您可以在此处找到代码:Sample BLOB code

请注意,对于那些敢于使用BLOB的人来说,SQLite有几个潜在的陷阱。其中一个主要问题是SQLite在允许你甚至检查它们的长度之前将整个BLOB字段加载到内存中。所以如果你有大的BLOB字段,那么期望大量的内存抖动......