2 u011453773 u011453773 于 2015.07.16 21:59 提问

cursorwindow数据库并发读写

现在有一个listview,绑定一个adapter,在adapter里根据position,用cursor去获取数据库中一个表TB的数据,假设表中有200行数据。屏幕可以显示10行listview的item,现在滑到了list底部,这个时候还有一个按钮,按下的时候开启一个新线程1,在这个新线程里删掉了表TB最末尾20行数据,
于是在线程1里用Message传一个消息,
让UI主线程里的handler去更换cursor,调adapter的notifydatasetchanged(),更新listview,

那么问题来了,如果在线程1里,删掉数据后,传递消息前,我向上滑了一下listview
那么这个时候会调用adapter的getview,position为200-10=190,调用cursor的movetoposition(190),然后getString();

此时,cursorwindow里数据只有0-179条数据,但我却请求了第190条数据,会引发一个cursorwindow的异常,大概是can not get row 190 in a cursor window of 180 rows.
要怎么避免这个异常,或者怎么做到及时更新我的cursor或cursorwindow呢?

4个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.07.16 23:01
已采纳

如果游标方式显示listview,那就不能增删数据,如果有增删数据,那就把数据查出来,放到list或者map中,再通过adapter进行显示。

danielinbiti
danielinbiti 回复cwhfjcy: 分页获取数据
2 年多之前 回复
u011453773
u011453773 如果数据量太大,一次性加载到内存里,内存占用太大,该怎么破?
2 年多之前 回复
cc_lova_wxf
cc_lova_wxf   2015.07.16 22:39

为什么会有这种情况发生,在线程里删掉数据后,马上用handle发送消息到主线程更新,前后就几行代码的执行时间,你可以在这段极其微妙的时间差操作?再说了,既然是在界面上显示的,那么数据就已经读到内存中了,你无论怎么getview都是读的内存数据,只有在调用notifydatasetchanged才会刷新内存呢。

u011453773
u011453773 然后getView是用cursor去读数据的,而cursor读的数据不一定是内存里的,具体可以看看cursorwindow的机制……
2 年多之前 回复
u011453773
u011453773 实际应用里,如果数据量很大,主线程更新也可能花一定的时间的
2 年多之前 回复
u011453773
u011453773 点完按钮后,我滑了listview,这个时候,就有可能会在主线程更新前去读旧的cursorwindow,就会出现前面的情况
2 年多之前 回复
u011453773
u011453773 点了一下按钮,然后让那个线程先sleep1s,再开始删数据,
2 年多之前 回复
u011453773
u011453773 关于时间差的问题,可以是这样的:
2 年多之前 回复
alexwan19890702
alexwan19890702   2015.07.21 17:46

要么使用对象锁,要么使用Blockingqueue

u011453773
u011453773   2015.07.22 13:10

在执行moveToPosition()或者写DB的操作时都要请求锁吗?

Csdn user default icon
上传中...
上传图片
插入图片