You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询大数据时sqldelight数据库出现SQLiteException如何解决?

解决SQLDelight大数据量查询触发的SQLiteBlob读取错误

当使用SQLDelight检索大量数据时,会触发如下错误:

android.database.sqlite.SQLiteException · unknown error (code 0 SQLITE_OK): Native could not read blob slot CursorWindow.java:-2

若确认是查询触及操作大小限制导致,可通过以下方式绕过:

  • 分页查询
    避免一次性加载全量数据,用LIMIT结合主键范围查询(比OFFSET效率更高)拆分请求。示例:

    SELECT * FROM your_table WHERE id > ? LIMIT 100;
    

    每次查询一批数据,处理完成后再获取下一批,避免CursorWindow被超大数据集占满。

  • 优化Blob字段处理
    如果查询包含大Blob类型字段:

    • 优先查询非Blob字段,仅在需要使用Blob时单独执行读取操作;
    • 将大Blob文件存储到本地文件系统,数据库仅保存文件路径,大幅降低单次查询的数据量。
  • 调整CursorWindow大小(不推荐)
    Android系统中CursorWindow默认大小通常为2MB,可通过反射或自定义ContentProvider调整其容量,但该方式兼容性差,可能在不同系统版本出现异常,仅作为备选方案。

  • 利用SQLDelight流式查询
    借助SQLDelight的流式查询能力,通过asFlow()将结果转为Flow,逐行处理数据,避免一次性加载所有数据到内存:

    yourQueries.selectAll().asFlow().collect { query ->
        query.executeAsList().forEach { item ->
            // 逐行处理数据逻辑
        }
    }
    

内容的提问来源于stack exchange,提问作者Levon Petrosyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:01:19