2017-07-28 16 views
5

Podczas korzystania pokój z Androidem Architektury Components, otrzymałem następujący komunikat o błędzie podczas próby uzyskania dostępu do bazy danych za pomocą składnika Dagger:próba pokoju do ponownego Otwórz już zamknięta baza

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: (database path) 

używałem wersji Dagger 2.11 i wersja pokoju 1.0.0-alpha7. Błąd był odtwarzalny w wersji 1.0.0-alpha5.

Ten błąd wystąpił przy każdej próbie uzyskania dostępu do bazy danych za pośrednictwem DAO po zainicjowaniu bazy danych i wstrzyknięciu jej do mojej klasy.

Odpowiedz

19

To dlatego staramy się zmodyfikować schemat istniejącej bazy bez podawania jakichkolwiek informacji o migracji. Więc zasadniczo próbuje zapisać nowy schemat bazy danych do istniejącego DB, który nie działa.

Są na to dwa sposoby. Jeśli jesteś w swoim środowisku deweloperskim, co można zrobić, to awaryjny do destrukcyjnej migracji, aby zrobić ten kod tworzenia bazy danych będzie wyglądać mniej więcej tak:

MyDatabase myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my-db") 
    .fallbackToDestructiveMigration() 
    .build(); 

Oznacza to, kiedy podać bazę danych z uaktualnioną lub nowy podmiot zrobi to, co odpowiedziała odpowiedź @huw i po prostu usunie bazę danych z instalacji aplikacji, usuwając z niej wszystkie dane i wydając nową instalację.

Inną metodą jest użycie funkcji migracji. Są one dość długo, więc chyba że ktoś chce mnie napisać to tutaj zostawię go teraz, ale w zasadzie, dokumentację można znaleźć tutaj:

Room DB Migration Documentation

To w istocie powoduje, że DB do uruchomienia niektórych SQL dostarczonego samodzielnie, aby zaktualizować bazę danych do nowej wersji. W ten sposób możesz zagwarantować, że żadne dane nie zostaną utracone podczas migracji; lub w jak najmniejszym stopniu w zależności od tego, co robisz. Jest to preferowana metoda dla aplikacji produkcyjnych, ponieważ oznacza to, że użytkownicy nie utracą swoich wcześniejszych danych i nie dostaniesz wielu złych recenzji/zagubionych klientów.

Nadzieja, która sprawia, że ​​pomaga!

+2

Pamiętaj, aby zmienić wersję bazy danych w adnotacjach @Database. fallbackToDestructiveMigration() nie zresetuje DB tylko dlatego, że struktura DB została zmieniona. – Andrew

5

Jednym z rozwiązań tego problemu było usunięcie pliku bazy danych i rozpoczęcie od nowa. Nie stanowiło to problemu, ponieważ testowałem i mogłem zasiedlić bazę danych przy użyciu danych online.

Aby to zrobić albo:

  • informacji App> Przechowywanie> Wyczyść dane
  • ręcznie usunąć plik w /data/data/com.app.example/databases/database.db
Powiązane problemy