2016-07-02 5 views
0

AsyncTaskのデータベーステーブルから複数の値を取得するときにこのエラーが発生します。私はすべて私のコードからdb.close()を削除しましたが、エラーは修正できません。私はこの問題を解決するために助けが必要です。db.close()が削除されましたが、「接続プールが閉じられているためこの操作を実行できません」例外

このエラーLogCat

java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:300) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. 
at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:1027) 
at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:664) 
at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:397) 
at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:905) 
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834) 
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62) 
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144) 
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) 
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197) 
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237) 
at com.magusapp.rbc.DBAdapter.getAllData(DBAdapter.java:351) 
at com.magusapp.rbc.NewLogin$Upload.doInBackground(NewLogin.java:357) 
at com.magusapp.rbc.NewLogin$Upload.doInBackground(NewLogin.java:339) 
at android.os.AsyncTask$2.call(AsyncTask.java:288) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
... 4 more 

これは、あなたが複数のスレッドからデータベースを操作する場合は、この例外はまた何かをして、例えば(観察されたデータベース・コード・サンプル

public ArrayList<MainDetails> getAllData(String stationid, String date) { 
    ArrayList<MainDetails> todos = new ArrayList<MainDetails>(); 
    String selectQuery = "SELECT * FROM " + TABLE_LABELS3 + " WHERE " + KEY_STATIONID + " = '" + stationid + "' AND " + KEY_DATE + " = '" + date + "'"; 

    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor c = db.rawQuery(selectQuery, null); 

    //error 
    // looping through all rows and adding to list 
    if (c != null) { 
     if (c.moveToFirst()) { 
      do { 
       MainDetails md= new MainDetails(); 
       md.setQuestionID(c.getString((c.getColumnIndex(KEY_QUESTIONID)))); 
       md.setStatus(c.getString((c.getColumnIndex(KEY_STATUS)))); 
       md.setComment((c.getString(c.getColumnIndex(KEY_REMARK)))); 


       // adding to todo list 
       todos.add(md); 
      } 
      while (c.moveToNext()); 
     } 
    } 

    return todos; 
} 
+0

'db.close()'は接続プールを閉じません。プールにデータベース接続を解放します。それを削除してこの動作を変更する必要はありません。アプリケーションのライフサイクルで遅すぎるデータベース操作を行っています。 – EJP

答えて

0

です非同期タスクで、同時にデータベースと通信するGUIを維持しながら、値を表示するためにデータベースハンドルを開閉します)。

AsyncTaskの実行中にGUIがデータベースと通信しないかどうかを確認します。これが理由であるかどうかを確認するには、GUIスレッドを一時的に停止する(または起動後に数秒の遅延ステートメントを入れるだけで)タスクの終了を待つだけです。これは実際には生産中ではありませんが、開発環境でグリッチを特定する仕事をするでしょう。

関連する問題