如何在SQLite中分段更新blob?

如何在SQLite中分段更新blob?,sqlite,blob,Sqlite,Blob,我在SQLite应用程序中有大的blob,需要以分段方式更新这些blob的小部分。类似于说“用数据D更新blob的X到Y字节”,这可以在其他具有blob操作函数的数据库中完成,但我在SQLite中找不到类似的东西,我卡住了吗?还是SQLite有处理blob的方法 谢谢。SQLite 3.x通过函数支持这一点 int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset) 请注意,此函数是作为SQLite 3 C

我在SQLite应用程序中有大的blob,需要以分段方式更新这些blob的小部分。类似于说“用数据D更新blob的X到Y字节”,这可以在其他具有blob操作函数的数据库中完成,但我在SQLite中找不到类似的东西,我卡住了吗?还是SQLite有处理blob的方法


谢谢。

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

int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset)
请注意,此函数是作为SQLite 3 C/C++API的一部分提供的。要使用它,您需要直接对此进行编程


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

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

blob完全破坏了SQL查询格式。如果您的blob数据需要任何类型的处理,那么在某个时候它肯定需要过滤。在这方面,任何处理SQL中过滤的机制都是无用的

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

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


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

我完全同意paniq所说的一切。使用blob会极大地限制您的选择

如果您使用的是System.Data.SQLite,那么您就不会真正支持blob。这就是为什么我写了自己的类来处理它们。您可以在此处找到代码:


请注意,对于那些敢于处理blob的人来说,SQLite有几个潜在的陷阱。其中一个主要问题是SQLite在允许您检查整个BLOB字段的长度之前将其加载到内存中。。因此,如果你有大的斑点字段,那么你会有大量的内存波动

我的blob可能偶尔会增长,但那是在服务的全面升级过程中,所以说它们在“产品周期”内是恒定长度是“安全的”(无论长或短),但是,我完全同意你说的每一句话,我真的希望避免blob,但是因为规范的布局方式,我别无选择,竖起大拇指。在这件事结束之前,他需要大量的法律意见PYour文件不适用于任何读者,仅供参考。System.Data.SQLite 1.0.103.0以上版本(2016年9月15日左右发布)中似乎存在此功能