10

これは数日間私を夢中にしています。私はかなり複雑なアンドロイドアプリケーションを持っています。これは、複数のスレッドを使用してサーバーからデータを取得し、SQLiteデータベースにデータを取り込みます。私はSQLiteOpenHelperの私の拡張を参照するためにシングルトンを使用しています。私はそれぞれの活動でデータベースを開いたり閉じたりしています。Android SQLite SQLiteOpenHelper IllegalStateException - DBが既に閉じているエラー

エラーは、私が4アクティビティの深いところでエラーが発生した場合にのみ、エラーが発生します。私はonDestroy()メソッドからonPause()メソッドにcloseを移動し、onResume()に別のオープンを追加するなど、データベースのオープンとクローズのさまざまな方法を試しました。 http://darutk-oboegaki.blogspot.com/2011/03/sqlitedatabase-is-closed-automatically.html

私は、コードを経て、私は確信して作りました。また、ノートの

、私の活動はデータベースを引き起こす可能性があり、私は理解してリストビューとExpandableListViews、を多用するこの記事をもとに閉じるには、すべてのカーソルを閉じるか、アダプタに割り当てられている場合はstartManagingCursor()を呼び出します。

何が起こっているかについて誰かが手掛かりを持っていますか?

java.lang.RuntimeException: Unable to resume activity {com.fieldone/com.fieldone.DispatchActivity}: java.lang.IllegalStateException: database /data/data/com.fieldone/databases/InterstateAirConditioning-1602814322.db already closed 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3347) 
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3362) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2162) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:144) 
    at android.app.ActivityThread.main(ActivityThread.java:4937) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalStateException: database /data/data/com.fieldone/databases/InterstateAirConditioning-1602814322.db already closed 
    at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:237) 
    at android.database.sqlite.SQLiteQuery.requery(SQLiteQuery.java:145) 
    at android.database.sqlite.SQLiteCursor.requery(SQLiteCursor.java:567) 
    at android.app.Activity.performRestart(Activity.java:3836) 
    at android.app.Activity.performResume(Activity.java:3857) 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3337) 
    ... 10 more 

UPDATE:私は問題を修正しましたが、これはそれを修正する理由がわからないてきました。だから、多分誰かが知っているか説明することができます。

私が4回目のアクティビティを行っているとき、db.close()でdbをクローズしようとしていました。私が必要とするデータを取得した後、またはonStopまたはonDestroyで、このエラーを生成するonCreateのどこに置いても問題ありません。私がデータベースを閉じないと、私は問題を抱えていません。だから、何かが自動的にデータベースを閉じている原因です。私はこの最終アクティビティでexpandableListViewを使用していますが、私はcursorAdapterを使用していません。誰でも考えがありますか?これを理解するのが大好きです。

答えて

19

この質問は、注意の良い取引を得ているので、私はそれに答え、私が学んだ、何が私の大規模なデータベース駆動型アプリケーションでは、この問題を修正するために私のために働いたかを説明したかった:

  1. は、管理対象のカーソルを使用しないでください。なぜ彼らは非難されている理由があります。彼らは完全に問題があります。現実的には、管理されたカーソルを実際に使用する必要があるシナリオはごくわずかです。その代わりに、クエリを実行し、オブジェクトに結果を設定します。あなたは複数行のクエリを実行している場合、すべての行を保持するために、あなたのオブジェクトのArrayListの<>を作成します。私が今行うことは、クエリを実行し、戻り値のカーソルではなく、ArrayList <>を返す関数を作成することです。私は関数内のカーソルを閉じて、私は完了です。 ListViewsでは、SimpleCursorAdapterを使用できなくなります。これらのすべてをBaseAdapterに変換し、ArrayList <>オブジェクトを使用して設定します。

  2. すべてのカーソルを閉じることを忘れないでください。これはまた、あなたのアプリのdb接続に大混乱を招く可能性があります。私はこれをやっていると思っていましたが、確かにカーソルを明示的に閉じていないところが見つかりました。だから、あなたのアプリを通過し、それらのすべてをダブルチェックしてください。

また、シングルトンDatabaseHelperオブジェクトも使用しています。私はSQLiteOpenHelperクラス内に静的なDatabaseHelperオブジェクトを宣言し、毎回同じインスタンスを取得しています。

私は今、これらのDBエラーを取得しない安定した実行中のアプリケーションを持っています。私はこの情報があなたの中に役立つことを願っています。

2

使用CursorAdapter.changeCursor(ヌル)、このバグの出現を遅らせることができますが、完全にproblomを解決することはできません、時間の未知の期間が再び表示されます。 これも私を夢中にさせてくれました!

1

私はfillWindow()とIllegalStatementExceptionのカーソルが無効な文で 'db already closed'例外も発生しました。私がしたことは、メソッド変数の代わりにインスタンス変数にカーソルを置いた後、私のonStopメソッドとonPauseメソッドで、stopManagingCursorを呼び出し、次に私のonResumeメソッドとonStartメソッドでstartManagingCursorを呼び出すということでした。

それは私のために私の問題を解決しました。私はlogcatで何かエラーや警告メッセージを見つけられませんでした。

関連する問題