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
本文介绍了Android 9(仅观察到)使用房间(用于非图像):行太大,无法放入光标窗口需要Pos=0,totalRow=1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我只在Android 9上观察到了这一点,可能只在三星设备上观察到了这一点。我正在将多个序列化字符串的多个JSON响应存储到我的数据库中,以便稍后使用Moshi再次转换为模型。
导致此错误的查询为:
@Query("SELECT * FROM tasks")
public abstract Flowable<List<TaskEntity>> getAll();
最后一个实例在表中总共有大约392,000个字符。这些条目实际上在表中被拆分成大约5500个字符大小的条目。
- 为什么游标在处理大约11k字节大小的条目时会有问题?我选择*这一事实是否意味着游标正在将整个表抓取到内存中,而不是一次只抓取一行?
- 为什么只有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屋!
查看全文