程序获取一个游标并在几个不同的地方用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()
,它也会因同样的异常而崩溃。
该问题仅影响数据库中的一个表。我从电话中取出数据库文件并在我的电脑上打开它似乎很好。我能够在它上面运行导致问题的相同查询,它运行得很好。
然后我从手机中完全删除了应用并将其重新安装,问题似乎已经消失。所以一方面它看起来像一张腐败的桌子而另一方面它没有......
更新
此错误再次发生在同一个表中。在设备上重新安装应用程序后,问题就消失了一段时间。我会看看我是否可以在它开始时进行追踪。
答案 0 :(得分:2)
我发现,当查询中涉及的表达到一定大小时,就会发生这种情况。它做了一个相当昂贵的JOIN,看起来它太密集了。
答案 1 :(得分:0)
我在我的android EMULATOR中看到了同样的异常:
实际上,我已经使用几个连接执行了一个SQL查询,这返回了很多结果。 当我用另一个测试用户运行相同的查询时,数据较少,我没有看到异常。
但是,在我的三星Galaxy Tab中测试同样的情况时,谢天谢地,它运行良好:P。
我想这是EMULATOR的内存限制?
答案 2 :(得分:0)
我在两个表上使用union查询时收到此错误。由于无法直接应用与sqlite联合的限制,解决方案是使用子查询作为描述here