我在5月份在[android-developers] Google群组上发布了this。我从来没有听到过,直到上周我的一个学生做了这个问题才得以重现。我想我会把它放在这里,看看它是否为任何人响了。例外:尝试获取关闭SQLiteClosable上的引用
在我的代码示例之一,我有以下方法:
static Cursor getAll(SQLiteDatabase db, String orderBy) {
return(db.rawQuery("SELECT * FROM restaurants "+orderBy, null));
}
当我运行它,偶尔,我得到这个:
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):
java.lang.IllegalStateException: attempt to acquire a reference on a
close SQLiteClosable
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:31)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:56)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1118)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1092)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
apt.tutorial.Restaurant.getAll(Restaurant.java:14)
这是没有意义的我。数据库绝对是开放的。该 SQLiteClosable
是SQLiteQueryDriver
创建的SQLiteQuery
,我 看到任何证据表明存在一个对象池或东西会在这里 可能解释了为什么一个“新” SQLiteClosable
已经关闭。事实上,它是零星的(意味着相同的UI操作有时会触发异常,但并不总是)建议某种游泳池,种族 条件,或其他...但我不知道在哪里。
想法?
谢谢!
UPDATE:有问题的代码来自我的Android Programming Tutorials书中的LunchList教程。它有点分散,不太适合直接在SO中发布。如果你想看看它,你可以从上面的链接下载该书的代码。我不记得该学生当时正在编写的教程的哪个版本,尽管它在Tutorial 12-Tutorial 16范围内。我主要希望碰到一个曾经绊倒过这个问题的人,并且有可能是罪魁祸首。我很确定我的数据库是开放的。再次感谢!
你有没有在这方面取得任何进展? – 2009-10-10 09:34:35
查看我刚添加到原始查询中的更新。这种情况很少发生,我并不担心;我只是希望以前有问题的人会看到这个问题。谢谢! – CommonsWare 2009-10-10 12:00:17
是的,我也很少发生这种情况。尽管如此,我还是希望至少能找到一份关于它的错误报告,但我没有。 – 2009-10-11 06:36:25