gpt4 book ai didi

Android数据库-无法执行此操作,因为连接池已关闭

转载 作者:可可西里 更新时间:2023-11-01 18:55:35 33 4
gpt4 key购买 nike

我对 android 数据库和游标有奇怪的问题。有时(很少)发生,我收到客户的崩溃报告。很难找出它崩溃的原因,因为我有大约 150,000 名活跃用户,而且每周大约有 1 份报告,所以这确实是一些小错误。这是异常(exception):

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数据库-无法执行此操作,因为连接池已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23387405/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com