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!

questionAnswers(4)

yourAnswerToTheQuestion