我在5月将this发布到[android-developers] Google网上论坛。我从来没有回音,直到上周我的一位学生做完为止,我无法重现该问题。我想我会把它张贴在这里,看看它是否对任何人都产生了影响。
在我的一个代码示例中,我具有以下方法:
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
是SQLiteQuery
创建的SQLiteQueryDriver
,我没有证据表明这里有对象池或正在发生什么
这可能解释了如何关闭“新的”
SQLiteClosable
。的它是零星的事实(有时意味着相同的UI操作
触发异常,但并非总是如此)建议某种类型的合并,种族
条件,还是什么……但我不确定在哪里。
有什么想法吗?
谢谢!
更新:有问题的代码来自Android Programming Tutorials书中的LunchList教程。它有点分散,不适合直接在SO中发布。如果您想看一下,可以从上面的链接下载该书的代码。我不记得当时该学生正在使用哪个版本的教程,尽管它位于“教程12-教程16”范围内。我主要是希望遇到一个以前曾因这个问题而绊倒并可能是罪魁祸首的人。我相当确定我的数据库是开放的。再次感谢!
最佳答案
这使我发疯了最长的时间。我发现的解决方案非常简单:不要保留对SQLiteDatabase
对象的引用。而是使用SQLiteOpenHelper
并在每次需要时调用getWritableDatabase()
。从文档:
答案一直都在那里。