Exceção: tentativa de adquirir uma referência em um fechamento SQLiteClosable
eu posteiisto em maio, no [Grupo de desenvolvedores do Android] do Google. Eu nunca ouvi de volta e não fui capaz de reproduzir o problema até que um dos meus alunos fez na semana passada. Eu imaginei que iria postar aqui e ver se isso soava para qualquer um.
Em um dos meus exemplos de código, tenho o seguinte método:
static Cursor getAll(SQLiteDatabase db, String orderBy) {
return(db.rawQuery("SELECT * FROM restaurants "+orderBy, null));
}
Quando eu corro, esporadicamente, eu entendo isso:
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)
Isso não faz sentido para mim. O banco de dados está definitivamente aberto. oSQLiteClosable
é oSQLiteQuery
criado porSQLiteQueryDriver
, e não vejo nenhuma evidência de que há um objeto pool ou algo acontecendo aqui que possa explicar como um "novo"SQLiteClosable
já está fechado. O fato de ser esporádico (o que significa que as mesmas operações da interface do usuário às vezes acionam a exceção, mas nem sempre) sugere algum tipo de pool, condição de corrida ou algo assim ... mas não tenho certeza de onde.
Pensamentos?
Obrigado!
ATUALIZAR: O código em questão é dos tutoriais da LunchList da minhaTutoriais de programação para Android livro. É um pouco difundido e não muito adequado para postar diretamente no SO. Você pode fazer o download do código desse livro no link acima, se quiser dar uma olhada nele. Não me lembro exatamente em qual edição do tutorial o aluno estava trabalhando na época, embora estivesse na faixa do Tutorial 12-Tutorial 16. Eu estava na maior parte esperando encontrar alguém que tivesse tropeçado sobre este problema antes e tivesse um provável culpado. Tenho certeza de que meu banco de dados está aberto. Obrigado novamente!