【问题标题】:"Cannot perform this operation because the connection pool has been closed."“无法执行此操作,因为连接池已关闭。”
【发布时间】:2015-07-12 10:57:29
【问题描述】:

首先,这是代码块和下面的 LogCat。注意崩溃的线。

if (!database.isOpen()) {
    open();
}

Cursor c = database.rawQuery(check_for_special, new String[]{String.valueOf(debt_id), sMonth});
if (c.getCount() == 0) { // LINE OF CRASH HERE
    c.close();
    return BigDecimal.ZERO;
} else {
    c.moveToFirst();
    BigDecimal amount = new BigDecimal(c.getDouble(c.getColumnIndex("payment")));
    c.close();
    return amount;
}

LogCat:

05-02 12:33:29.539: E/AndroidRuntime(14318): FATAL EXCEPTION: AsyncTask #5
05-02 12:33:29.539: E/AndroidRuntime(14318): Process: com.kickinglettuce.debtplannerpro, PID: 14318
05-02 12:33:29.539: E/AndroidRuntime(14318): java.lang.RuntimeException: An error occured while executing doInBackground()
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at java.lang.Thread.run(Thread.java:818)
05-02 12:33:29.539: E/AndroidRuntime(14318): Caused by: java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at com.---.---.DebtDataSource.getSpecialPayment(DebtDataSource.java:1389)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at com.---.---.DebtDataSource.payoffDebt(DebtDataSource.java:687)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at com.---.---.PlannerFragment$PlannerTask.doInBackground(PlannerFragment.java:181)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at com.---.---.PlannerFragment$PlannerTask.doInBackground(PlannerFragment.java:145)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
05-02 12:33:29.539: E/AndroidRuntime(14318):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-02 12:33:29.539: E/AndroidRuntime(14318):    ... 4 more

我不理解这个错误。我在很多地方读到您可以删除close() 电话,但这无济于事。特别是因为它在那之前崩溃了。

对此有什么想法吗?

【问题讨论】:

  • 只是猜测。你显示的方法或方法open()同步了吗?

标签: android sqlite illegalstateexception


【解决方案1】:

将 moveToFirst 方法移到 getCount 方法之前。

【讨论】:

  • 所以当我这样做时,我知道moveToFirst() 方法会出现同样的错误。
  • @KickingLettuce 是吗?这太有趣了。对我来说,当我遇到同样的问题时,这是一个解决方案。在那种情况下,我会说看看你的 open 方法,看看你是否正确打开了数据库
【解决方案2】:

当数据库已经关闭时抛出此异常。在粘贴代码if (!database.isOpen()) { 中看到你的第一行让我觉得你在其他地方有database.close()。如果是这种情况,只需将其删除即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 2015-02-27
    • 2013-04-10
    • 2014-06-16
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多