W maju opublikowałem this w grupie dyskusyjnej [android-developers] Google. Nigdy nie słyszałam odpowiedzi i nie udało mi się odtworzyć problemu, dopóki jeden z moich studentów nie zrobił tego w zeszłym tygodniu. Pomyślałem, że zostawię to tutaj i zobaczę, czy zadzwoni jakiemukolwiek dzwonowi.Wyjątek: próba uzyskania odniesienia do bliskiego SQLiteClosable
W jednym z próbki kodu, mam następujące metody:
static Cursor getAll(SQLiteDatabase db, String orderBy) {
return(db.rawQuery("SELECT * FROM restaurants "+orderBy, null));
}
Podczas uruchamiania go sporadycznie, otrzymuję to:
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)
To nie ma sensu mnie. Baza danych jest zdecydowanie otwarta. SQLiteClosable
jest SQLiteQuery
stworzony przez SQLiteQueryDriver
i widzę żadnych dowodów, że istnieje pula przedmiot lub coś się dzieje tutaj które mogłyby wyjaśnić, jak „nowy” SQLiteClosable
jest już zamknięta. The Fakt, że jest on sporadyczny (co oznacza, że te same operacje interfejsu użytkownika, czasami uruchamiają wyjątek, ale nie zawsze) sugeruje jakiś rodzaj puli, wyścigu lub coś takiego ... ale nie jestem pewien gdzie.
Myśli?
Dzięki!
AKTUALIZACJA: Kod, o którym mowa, pochodzi z podręczników LunchList z mojej książki Android Programming Tutorials. Jest nieco rozłożony i niezbyt dobrze nadaje się do publikowania bezpośrednio w SO. Możesz pobrać kod tej książki z powyższego linku, jeśli chcesz go obejrzeć. Nie pamiętam dokładnie, która edycja samouczka, nad którym pracował student w tym czasie, choć była w zakresie 12-tutorialowego kursu Tutorial 16. Miałem przede wszystkim nadzieję, że natknę się na kogoś, kto wcześniej potknął się o ten problem i miał prawdopodobnego winowajcę. Jestem prawie pewien, że moja baza danych jest otwarta. Dzięki jeszcze raz!
Czy zrobiłeś postęp w tej sprawie? –
Zobacz aktualizację, którą właśnie dodałem do pierwotnego zapytania. To takie rzadkie zjawisko, że nie martwię się zbytnio; Miałem tylko nadzieję, że ktoś, kto wcześniej miał problem, zobaczy pytanie. Dzięki! – CommonsWare
Tak, to też zdarza się bardzo rzadko. Wciąż spodziewałbym się przynajmniej znaleźć raport o błędzie, ale tego nie zrobiłem. –