由 android.database.CursorWindowAllocationException 引起
Posted
技术标签:
【中文标题】由 android.database.CursorWindowAllocationException 引起【英文标题】:Caused by android.database.CursorWindowAllocationException 【发布时间】:2021-09-08 14:17:24 【问题描述】:我在我的应用程序中使用房间数据库。我有一个功能可以在我的应用程序中下载一些内容。当每个内容都保存在我的数据库中时,我需要更新一个表,其中包含指示是否保存每个内容的列。保存内容时,我们在表格中设置一个布尔值。
所以流程是:调用一个API,保存其内容,然后将另一个表中的更新列保存为true。这发生在多个 API 上。每个内容保存成功都会在另一个表中执行更新查询。所有 API 调用都是按顺序调用的。
我收到 DAO 的以下错误。
Caused by android.database.CursorWindowAllocationException Cursor window allocation of 2048 kb failed. # Open Cursors=321 (# cursors opened by this proc=321)
每个内容保存后,代码流程如下:
myDao.updateStatus(id) //updates a column value to true
.subscribeOn(Schedulers.io())
.subscribe
myDao.getContent(id) //Select query to check id is present in table or not
.subscribeOn(Schedulers.newThread())
.subscribe count ->
if (count > 0)
//Call next API
DAO 只是更新一个小内容并选择只有几个布尔列的单行。所以,这不会达到 2MB。那为什么这个DAO会出现这个异常呢?
【问题讨论】:
这能回答你的问题吗? android.database.CursorWindowAllocationException when moving a Cursor 【参考方案1】:Refer here。看来您正在调用相同的方法,其中 al this 是从您编写 call next api 的地方编写的,这会阻止先前的游标关闭并实质上将您置于递归循环中。
尝试使用
Single.fromCallable
//synchronous api call here
//database insertion of content here
//database updation of status here
//put all the above in a loop
.subscribeOn(Schedulers.io())
这样,您的代码将变得更具可读性和可理解性。但是,如果您仍然喜欢异步调用 api,请尝试使用中间层来处理网络层和数据库层之间的连接,例如视图模型,并首先在其上获取网络结果,然后在成功回调上添加订阅上述代码。
【讨论】:
以上是关于由 android.database.CursorWindowAllocationException 引起的主要内容,如果未能解决你的问题,请参考以下文章
jQuery 插件可由控制台触发,但不能由函数触发 - 为啥会这样?
由 coercion 引入的 NAs 由 knn 中的 coercionError 引入