当前位置: 首页 > 面试题库 >

Android:由于连接池已关闭,无法执行此操作

殷功
2023-03-14
问题内容

我正在阅读有关此问题,但仍然没有找到解决方案。我注意到有时,我的应用会引发此错误:

   java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
        at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962)
        at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599)
        at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
        at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
        ...

我有一个DatabaseHelper.java使用此方法的文件,以获取其实例:

public static DatabaseHelper getInstance(Context context) {
    if (mInstance == null) {
        mInstance = new DatabaseHelper(context.getApplicationContext());
    }
    return mInstance;
}

然后,我有类似这样的方法(它在发生cursor.moveToFirst()该错误的行中崩溃)。它几乎从不崩溃,但有时会崩溃。

public Profile getProfile(long id) {
    SQLiteDatabase db = this.getReadableDatabase();

    String selectQuery = "SELECT * FROM " + TABLE_PROFILES + " WHERE " + KEY_PROFILES_ID + " = " + id;
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    Profile profile = new Profile();
    if (cursor.moveToFirst()) {
        doWhatEver();
    }
    cursor.close();
    db.close();

    return profile;
}

就这样,在我使用的所有方法中:

SQLiteDatabase db = this.getReadableDatabase(); (or Writable)

然后关闭游标和数据库。在这种情况下,该错误被抛出该行:

cursor.moveToFirst();

我不明白为什么如果我this.getReadableDatabase()之前打电话,错误提示数据库已关闭。请支持!谢谢 :)


问题答案:

去掉

db.close();

如果您在关闭数据库后尝试其他操作,它将给您该异常。

该文档说:

释放对对象的引用, 关闭对象…

另外,请查看 Android SqLite已关闭的异常,有关来自AndroidFramework工程师的评论,该评论指出不需要关闭数据库连接。

根据Dianne Hackborn(Android框架工程师)的说法,无需在内容提供商中关闭数据库

内容提供者是在创建其宿主过程时创建的,并且在过程中一直存在,因此无需关闭数据库,因为它将是内核的一部分,因此当该过程被清理时,它将关闭。被杀。

因此,无需关闭数据库。不需要时它将自动关闭。



 类似资料: