我有一个奇怪的问题与
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)
有人知道为什么吗我想,我正在检查所有可能的例外和条件…为什么我的应用程序崩溃在这里?
解决方法
问题
如果在关闭数据库后尝试另一个操作,它会给你异常.因为db.close();释放对象的引用,如果最后一个引用被释放,则关闭该对象.
解
在静态上下文中保存一个sqliteOpenHelper实例(Singleton).做懒惰初始化,并同步该方法.如
如果在关闭数据库后尝试另一个操作,它会给你异常.因为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