Android数据库 – 由于连接池已关闭,无法执行此 *** 作

Android数据库 – 由于连接池已关闭,无法执行此 *** 作,第1张

概述我有一个奇怪的问题与 android数据库和光标.时间(很少)发生,我得到客户的崩溃报告.很难找出为什么它崩溃,因为我有大约15万活跃用户,也许每周一个报告,所以这真的是一些小错误.这是例外: STACK_TRACE=java.lang.IllegalStateException: Cannot perform this operation because the connection pool 我有一个奇怪的问题与 android数据库和光标.时间(很少)发生,我得到客户的崩溃报告.很难找出为什么它崩溃,因为我有大约15万活跃用户,也许每周一个报告,所以这真的是一些小错误.这是例外:
STACK_TRACE=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)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 sk.mildev84.agendareminder.a.c.a(Sourcefile:169)

在每个游标“迭代和探索”之前,我使用这个代码确保一切正常:

db = instance.getWritableDatabase();cursor = db.rawquery(selectquery,null);if (isCursorEmptyOrNotPrepared(cursor)) {    ...    }private synchronized boolean isCursorEmptyOrNotPrepared(Cursor cursor) {        if (cursor == null)            return true;        if (cursor.isClosed())            return true;        if (cursor.getCount() == 0) // HERE IT CRASHES            return true;        return false;    }

它落在下面

if (cursor.getCount() == 0)

有人知道为什么吗我想,我正在检查所有可能的例外和条件…为什么我的应用程序崩溃在这里?

PS:所有的数据库方法是同步的,我正在打开和关闭数据库/游标在所有情况下,我检查了很多次.

解决方法 问题
如果在关闭数据库后尝试另一个 *** 作,它会给你异常.因为db.close();释放对象的引用,如果最后一个引用被释放,则关闭该对象.

在静态上下文中保存一个sqliteOpenHelper实例(Singleton).做懒惰初始化,并同步该方法.如
public class DatabaseHelper{    private static DatabaseHelper instance;    public static synchronized DatabaseHelper getInstance(Context context)    {        if (instance == null)            instance = new DatabaseHelper(context);        return instance;    }//Other stuff... }

你不必关闭它?当应用程序关闭时,它会放开文件引用,如果它甚至坚持下去.

即您不应该关闭数据库,因为它将在下次调用中再次使用.
所以只需删除

db.close();

欲了解更多信息,请参阅Single SQLite connection

总结

以上是内存溢出为你收集整理的Android数据库 – 由于连接池已关闭,无法执行此 *** 作全部内容,希望文章能够帮你解决Android数据库 – 由于连接池已关闭,无法执行此 *** 作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1133120.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存