如何在SQLite中逐段更新blob?

Rob*_*uld 6 sqlite blob

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

谢谢.

pan*_*niq 7

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

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

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

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

因此,作为您的律师,我建议您将blob作为原始文件写入文件系统,并仅在数据库中存储对文件名的引用.如果你的斑点很小并且保证不会长大,那就忘掉我的建议.

  • 好吧,我的 blob 可能偶尔会增长,但那是在服务的全面升级期间,因此可以“安全地”说它们在“产品周期”内保持恒定长度(无论是长还是短) (2认同)

Ash*_*Ash 5

SQLite 3.x 通过sqlite3_blob_write函数支持这一点。

int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset)
Run Code Online (Sandbox Code Playgroud)

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

如果您使用其他一些更高级别的包装器,例如 System.Data.SQLite,我上次查看时,您将无法访问此函数。