Android 9(仅观察到)使用房间(用于非图像):行太大,无法放入光标窗口需要Pos=0,totalRow=1 [英] Android 9(only observed) using Room(for non-images): Row too big to fit into CursorWindow requiredPos=0, totalRows=1

查看:0
本文介绍了Android 9(仅观察到)使用房间(用于非图像):行太大,无法放入光标窗口需要Pos=0,totalRow=1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只在Android 9上观察到了这一点,可能只在三星设备上观察到了这一点。我正在将多个序列化字符串的多个JSON响应存储到我的数据库中,以便稍后使用Moshi再次转换为模型。

导致此错误的查询为:

@Query("SELECT * FROM tasks")
public abstract Flowable<List<TaskEntity>> getAll();
最后一个实例在表中总共有大约392,000个字符。这些条目实际上在表中被拆分成大约5500个字符大小的条目。

  1. 为什么游标在处理大约11k字节大小的条目时会有问题?我选择*这一事实是否意味着游标正在将整个表抓取到内存中,而不是一次只抓取一行?
  2. 为什么只有Android 9?

谢谢。

推荐答案

我选择*是否意味着游标正在将整个表抓取到内存中,而不是一次只抓取一行?

SELECT *表示您正在检索所有列。没有WHERE子句(或其他类型的约束)的SELECT意味着您正在检索所有行。因此,SELECT * FROM tasks将尝试将整个表内容检索到内存中。

您可以将@Transaction添加到此函数中,因为这可能有助于克服此错误。引用the documentation

当在具有SELECT语句的Query方法上使用时,为Query生成的代码将在事务中运行。您可能希望在以下两种主要情况下执行此操作:

  • 如果查询的结果相当大,最好在事务中运行它以获得一致的结果。否则,如果查询结果无法放入单个CursorWindow中,则可能会由于两次光标窗口切换之间数据库的更改而损坏查询结果。
  • 如果查询结果是包含Relation个字段的POJO,则分别查询这些字段。若要在这些查询之间获得一致的结果,您还需要在单个事务中运行它们。
更好的做法是不将整个表的内容加载到内存中(然后将整个表的行转换为实体对象)。堆空间有限。

为什么只有Android 9?

没有线索。我不担心这一点-如果您专注于检索更少的数据,这将使您的所有用户受益。

这篇关于Android 9(仅观察到)使用房间(用于非图像):行太大,无法放入光标窗口需要Pos=0,totalRow=1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆