
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数据库 – 由于连接池已关闭,无法执行此 *** 作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)