2011-01-08 6 views
0

プログラムは、カーソルを取得し、いくつかの異なる場所でwhile(cursor.moveToNext())でそれをループしますが、特に1は、常にこの例外を与えている:SQLiteDiskIOException:Cursor.moveToNext(で起こったディスクI/Oエラー)

鑑賞
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()を呼び出そう

追加情報。

この問題は、データベースの1つのテーブルにのみ影響していました。私は電話機からデータベースファイルを取り出し、それを自分のコンピュータで開いたところ、問題なく見えました。私は問題を引き起こしていた同じクエリを実行することができましたが、うまくいきました。

その後、電話からアプリを完全に削除し、それを新しく再インストールしました。問題は消えてしまったようです。だから、一方で、それは破損したテーブルのように見えたし、他にはそれがなかった...

更新

このエラーは、同じテーブルに再び起きています。デバイスにアプリケーションを再インストールした後、しばらくの間問題が解消されました。私はそれが始まる時を追うことができるかどうかを見るでしょう。

+0

破損データのようですか? – Shardul

+0

それは単一のテーブルに限られているようで、並行性の問題ではないことを確認するためにいくつかのテストを実行しました。データベースファイルをディスクから取り出して見てもらえるかどうか確認します。 – cottonBallPaws

+0

私はディスクからdbファイルを取り出し、sqliteプログラムを使って開き、全く同じ質問を実行することができます。問題なくアプリで実行しています。 – cottonBallPaws

答えて

2

これは、クエリに関係するテーブルが特定のサイズになると発生していることがわかりました。それはかなり高価なJOINをやっていて、あまりにも集中しているようでした。私はアンドロイドのエミュレータでこれと同じ例外を見

0

:確かに

を、私は結果の良い束を返さ加入のカップル、とSQLクエリを実行していました。 別のテストユーザーと同じクエリを実行したとき、データが少なくても、例外は見られませんでした。

しかし、この同じ状況をSamsung Galaxy Tabでテストすると、ありがたいことに、うまくいきました。

私はそれがEMULATORのメモリ制限だと思いますか?

0

2つのテーブルの結合クエリでこのエラーが発生しました。 sqliteでユニオンの制限を直接適用することはできないので、解説でサブクエリを使用することでしたhere

関連する問題