从AsyncTask中的数据库表中检索多个值时出现此错误。我已从代码中删除了所有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 :(得分:0)
如果您从多个线程操作数据库(例如,在异步任务中执行某些操作,同时保持GUI也与数据库对话,打开和关闭数据库句柄以显示值),也会发现此异常)。
检查AsyncTask运行时GUI是否与数据库通信。要验证这是否是原因,只需等待任务结束,暂时停止GUI线程(或者在启动它之后放几秒延迟语句)。当然,这不应该在生产中,而是能够识别开发环境中的故障。