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