android - 从 Android sqlite 数据库中检索大 blob

标签 android sqlite blob protocol-buffers database-cursor

我在 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/

相关文章:

python - 我的 Flask python 应用程序需要进行哪些更改才能使用 MySQL 数据库?

python - SQLite DROP TABLE 语句的问题

c++ - 未处理的异常。访问违规阅读位置

java - 在 Java 应用程序中存储 SQLite 数据库的好地方在哪里?

Android:光标窗口已满

spring-mvc - MultipartFile/blob 问题保存在数据库中

android - toEndOf 在自定义对话框布局中不起作用

android - HTC Evo 3D 预览

android - 如何查看我的 Android 应用的网络消耗?

c# - Xamarin Android 和日期选择器