【发布时间】:2014-06-16 17:36:13
【问题描述】:
我对 android 数据库和游标有奇怪的问题。有时(很少)会发生,我收到客户的崩溃报告。很难找出它崩溃的原因,因为我有大约 150 000 个活跃用户,并且每周可能有 1 个报告左右,所以这确实是一些小错误。这是一个例外:
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:所有数据库方法都是同步的,我在所有情况下都正确打开和关闭数据库/游标,我检查了很多次。
【问题讨论】:
-
发布更多代码和完整的堆栈跟踪。你得到这个异常 -> 你在某个地方有错误
-
不需要关闭数据库。安卓处理。在这里阅读这个很好的解释...stackoverflow.com/questions/14002022/…
-
@Nepster 我想知道这是否仅适用于内容提供者
-
请问您是如何解决这个错误的?请让我知道@GuriBhai 解决方案是否适合您。我遇到了同样的错误,但关闭数据库并没有解决我的问题。
标签: android database android-cursor