SQLiteBlobTooBigException:写入数据库时​​行太大,无法放入 CursorWindow

tec*_*amp 6 java sqlite android

当我尝试添加到 android 上的 sqllite DB 时,我看到上述错误。我正在使用 cloudant 库。这是堆栈跟踪:

2019-07-17 18:04:48.292 5522-5753/org.iprd.identity E/SQLiteQuery: exception: Row too big to fit into CursorWindow requiredPos=0, totalRows=1; query: SELECT docs.docid, docs.doc_id, revid, sequence, current, deleted, parent, json FROM revs, docs WHERE docs.docid=? AND revs.doc_id=docs.doc_id AND revid=? ORDER BY revs.sequence LIMIT 1
2019-07-17 18:04:48.302 5522-5522/org.iprd.identity E/DatabaseImpl: Failed to create document
    java.util.concurrent.ExecutionException: android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1
        at java.util.concurrent.FutureTask.report(FutureTask.java:123)
        at java.util.concurrent.FutureTask.get(FutureTask.java:193)
        at com.cloudant.sync.internal.documentstore.DatabaseImpl.get(DatabaseImpl.java:1084)
        at com.cloudant.sync.internal.documentstore.DatabaseImpl.create(DatabaseImpl.java:925)
Run Code Online (Sandbox Code Playgroud)

我以前从未遇到过这个问题,但是,我最近进行了更改并开始使用第三方工具来给我一些图像。使用这个新工具,图像尺寸似乎比以前大得多。我通过对图像进行 Base64 编码将这些图像作为字符串存储在我的数据库中。然而,使用这个新工具,在存储图像时,我遇到了上述异常。

我有一个单元测试,我尝试使用从该图像生成的字符串之一,但这也会引发一个错误,即字符串大小太大,甚至无法编译。

解决这个问题的最佳方法是什么?-

  1. 我想做的是将图像存储在设备本身中,并将路径存储在数据库中。

  2. 我们可以对图像进行一些压缩以减小其文件大小吗?

  3. 是否可以调整一些数据库设置以确保它可以处理更大的图像尺寸?

提前致谢!

Mik*_*keT 5

我想做的是将图像存储在设备本身中,并将路径存储在数据库中。

不会回答,因为你是最好的回答这个问题的人。

我们可以对图像进行一些压缩以减小其文件大小吗?

有可能,但这并不一定能消除问题。即使您将图像压缩为 2Mb(光标窗口4Mb限制的一半),那么很可能一次只有 1 行适合光标窗口。结果可能是性能非常差,而且瓶颈并不是真正的 SQLite,而是处理游标。

  • 不建议

另一种解决方案(但成本仍然很高)是将图像存储在部分/块中,可以在此处找到这样做的示例(注意没有进行调整来建立 256kb 块大小) 。注意到响应时间被认为非常差

  • 不推荐,但如果性能不佳不是问题,那么可能是一个解决方案

不需要额外压缩/解压缩开销的解决方案是将图像或超过设定大小的图像存储在文件系统(例如外部存储)中并存储路径或路径的一部分。

  • 后一个选项,将小图像存储在数据库中,将较大图像存储为文件,可以利用比文件系统快 35%的优势。

  • 混合路径/blob 解决方案的示例在此处的答案中。

    • 请注意,此示例可用作仅存储路径或混合解决方案的基础。
  • 受到推崇的

是否可以调整一些数据库设置以确保它可以处理更大的图像尺寸?

是的。

您可以考虑:-


Har*_*nia -2

将图像存储在应用程序私有存储下的设备中。并将该图像路径存储在数据库中。