db.close() 已删除"Cannot perform this operation because the connection pool has been closed"但仍出现异常



在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;
}

如果您从多个线程操作数据库,也会观察到此异常(例如,在异步任务中执行某些操作,同时保持与数据库通信的GUI,打开和关闭数据库句柄以显示值)。

检查当你的AsyncTask正在运行时,GUI是否不与数据库通信。要验证这是否是原因,只需等待任务结束,暂时停止GUI线程(或者在启动它之后放置几秒钟的延迟语句)。可以肯定的是,这种方法不应该出现在生产环境中,但是可以用来识别开发环境中的故障。

相关内容

最新更新