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!
Pamiętaj, aby zmienić wersję bazy danych w adnotacjach @Database. fallbackToDestructiveMigration() nie zresetuje DB tylko dlatego, że struktura DB została zmieniona. – Andrew