我在SQLite应用程序中有大量blob,需要以分段方式更新这些blob的小段。有点像“用数据D更新blob B的字节X到Y”,这可以在其他使用Blob操作函数的数据库中完成,但我找不到像SQLite这样的东西,我卡住了吗?或者SQLite有办法操纵Blob吗?
感谢。
答案 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字段,那么期望大量的内存抖动......