如何调整Expo-SQLite的CursorWindow大小解决行数据过大报错问题
报错原因
该报错是Android系统底层SQLite的CursorWindow缓冲区默认大小仅为2MB导致的:你查询全表时,Literature表中某一行的value字段存储的文本体积过大,超过了单条行可加载的缓冲区上限,进而触发加载失败。
小提示:你当前的查询语句里表名加了单引号属于不规范写法,建议修改为
select * from Literature,不过该问题不是本次报错的根因。
解决方案
你可以根据你的业务场景选择以下任意一种方案解决:
- 按需查询避免全表加载大字段
如果你不需要同时获取所有行的value内容,优先不要使用select *查询全表:- 只在需要查询特定文献时,按主键
abbr定向查询单条数据:
tx.executeSql( "select * from Literature where abbr = ?", [targetAbbr], (tx, res) => console.log("查询成功", res), (tx, err) => console.log("查询失败", err) )- 如果只需要做列表展示,先仅查询
abbr字段生成列表,用户点击对应条目时再单独查询该条的value内容:
// 列表查询只取abbr字段 tx.executeSql("select abbr from Literature", [], ...) - 只在需要查询特定文献时,按主键
- 分页查询减少单次加载量
如果确实需要批量查询全表数据,用limit + offset做分页,每次仅加载少量行,根据单条数据体积调整每次加载的条数,单条内容越大每次加载条数越少:// 示例每次加载1条,offset传入当前分页偏移量 tx.executeSql("select * from Literature limit 1 offset ?", [currentOffset], ...) - 大文本拆分存储
如果单条value的内容本身就远超2MB,建议将长文本拆分为多个等长的短片段,存储到和Literature关联的子表中,查询时按顺序拼接片段即可,从根源避免单条行数据过大。
内容的提问来源于stack exchange,提问作者Oliver Saintilien
相关产品推荐
相关产品推荐

