我在 Android 应用的 sqlite 数据库中存储了大块的二进制数据(protobufs),却没有意识到 Android 的 Cursor
最多只能保存 1MB 的数据。我现在知道我应该将这些二进制 blob 存储在文件中,并且只引用 sqlite 数据库条目中的文件。
我需要升级数据库(该应用程序已经使用了一段时间)才能将这些二进制 block 移动到文件中。问题是某些用户的数据可能已经超过了 1MB 的限制,我无法从数据库中检索它(访问生成的 Cursor
以获取包含大 blob 的单行会引发 IllegalStateException: 无法从 CursorWindow 中读取第 0 行第 0 列。请确保在从 Cursor 访问数据之前对其进行初始化
)。
如何检索已存储在 sqlite 数据库中的大于 1MB Cursor
限制的二进制 blob?
最佳答案
您可以分段读取大块。首先找出哪些需要这种治疗:
SELECT id, length(blobcolumn) FROM mytable WHERE length(blobcolumn) > 1000000
然后用 substr
读取 block :
SELECT substr(blobcolumn, 1, 1000000) FROM mytable WHERE id = 123
SELECT substr(blobcolumn, 1000001, 1000000) FROM mytable WHERE id = 123
...
您也可以编译自己的 SQLite 副本并访问 BLOB stream I/O函数或 C API 的普通查询函数与 NDK,但在这种情况下太复杂了。
关于android - 从 Android sqlite 数据库中检索大 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12716859/