SQLiteDiskIOException:Cursor.moveToNext()上发生磁盘I / O错误

时间:2011-01-08 17:07:11

标签: android sqlite

程序获取一个游标并在几个不同的地方用while(cursor.moveToNext())循环遍历它,但特别是一个不断给出这个例外:

01-08 09:00:06.168: ERROR/AndroidRuntime(13434): Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error
01-08 09:00:06.168: ERROR/AndroidRuntime(13434):     at android.database.sqlite.SQLiteQuery.native_fill_window(Native Method)
01-08 09:00:06.168: ERROR/AndroidRuntime(13434):     at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:75)
01-08 09:00:06.168: ERROR/AndroidRuntime(13434):     at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:296)
01-08 09:00:06.168: ERROR/AndroidRuntime(13434):     at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:269)
01-08 09:00:06.168: ERROR/AndroidRuntime(13434):     at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:171)
01-08 09:00:06.168: ERROR/AndroidRuntime(13434):     at android.database.AbstractCursor.moveToNext(AbstractCursor.java:256)
01-08 09:00:06.168: ERROR/AndroidRuntime(13434):     at ... [my code]

在调试中观察它,它会到达while(cursor.moveToNext())行,然后在抛出此错误之前暂停几秒钟。

会出现此错误的可能问题是什么?

其他信息

如果我尝试拨打cursor.getCount(),它也会因同样的异常而崩溃。

该问题仅影响数据库中的一个表。我从电话中取出数据库文件并在我的电脑上打开它似乎很好。我能够在它上面运行导致问题的相同查询,它运行得很好。

然后我从手机中完全删除了应用并将其重新安装,问题似乎已经消失。所以一方面它看起来像一张腐败的桌子而另一方面它没有......

更新

此错误再次发生在同一个表中。在设备上重新安装应用程序后,问题就消失了一段时间。我会看看我是否可以在它开始时进行追踪。

3 个答案:

答案 0 :(得分:2)

我发现,当查询中涉及的表达到一定大小时,就会发生这种情况。它做了一个相当昂贵的JOIN,看起来它太密集了。

答案 1 :(得分:0)

我在我的android EMULATOR中看到了同样的异常:

实际上,我已经使用几个连接执行了一个SQL查询,这返回了很多结果。 当我用另一个测试用户运行相同的查询时,数据较少,我没有看到异常。

但是,在我的三星Galaxy Tab中测试同样的情况时,谢天谢地,它运行良好:P。

我想这是EMULATOR的内存限制?

答案 2 :(得分:0)

我在两个表上使用union查询时收到此错误。由于无法直接应用与sqlite联合的限制,解决方案是使用子查询作为描述here

相关问题