由 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 引起的主要内容,如果未能解决你的问题,请参考以下文章

结果集到 Android 光标

jQuery 插件可由控制台触发,但不能由函数触发 - 为啥会这样?

常用宏定义 - 由角度转换弧度由弧度转换角度

由 coercion 引入的 NAs 由 knn 中的 coercionError 引入

如何区分两个“onpause”事件 - 由单击“暂停”按钮引起,以及由到达媒体片段末尾引起?

Nginx实现动静结合(动态资源由tomcat管理: 静态资源由Nginx管理)