Ho inviato this a maggio sul [Google-sviluppatori] Google Group. Non ho mai sentito indietro e non sono stato in grado di riprodurre il problema fino a quando uno dei miei studenti non ha fatto la scorsa settimana. Ho pensato di pubblicarlo qui e vedere se suonava qualche campanello per chiunque.Eccezione: tentativo di acquisire un riferimento su una chiusura SQLiteClosable
In uno dei miei esempi di codice, ho il seguente metodo:
static Cursor getAll(SQLiteDatabase db, String orderBy) {
return(db.rawQuery("SELECT * FROM restaurants "+orderBy, null));
}
quando l'eseguo, sporadicamente, ottengo questo:
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)
Questo non ha senso per me. Il database è definitivamente aperto. Il SQLiteClosable
è il SQLiteQuery
creato da SQLiteQueryDriver
, e io vedono alcuna prova che ci sia un pool di oggetti o di qualcosa da fare qui che potrebbe spiegare come un "nuovo" SQLiteClosable
è già chiuso. Il è sporadico (il che significa che le stesse operazioni dell'interfaccia utente a volte attivano l'eccezione, ma non sempre) suggerisce una sorta di piscina, la condizione di gara o qualcosa del genere ... ma non sono sicuro di dove.
Pensieri?
Grazie!
UPDATE: il codice in questione proviene dai tutorial LunchList del mio libro Android Programming Tutorials. È un po 'diffuso e non è particolarmente adatto per pubblicare direttamente in SO. Puoi scaricare il codice per quel libro dal link sopra se vuoi dare un'occhiata a questo libro. Non ricordo esattamente quale edizione del tutorial su cui lo studente stava lavorando al momento, sebbene fosse nella gamma di Tutorial 12-Tutorial 16. Speravo in gran parte di imbattersi in qualcuno che aveva già inciampato su questo problema e aveva probabilmente un colpevole. Sono abbastanza sicuro che il mio database sia aperto. Grazie ancora!
Hai fatto progressi in questo? –
Vedere l'aggiornamento che ho appena aggiunto alla query originale. È un evento così raro che non sono terribilmente preoccupato; Speravo solo che qualcuno che avesse avuto il problema prima avrebbe visto la domanda. Grazie! – CommonsWare
Sì, capita molto raramente anche per me. Comunque mi sarei aspettato di trovare almeno un bug report per questo, ma non l'ho fatto. –