2014-06-05 2 views
7

Piszę aplikację dla Androida za pomocą SQLite DB.Nie mogę obniżyć wersji bazy danych z wersji 2 do 1, nawet po świeżej instalacji i ponownym uruchomieniu

miałem kilka eksperymentów i zmienił wersję DB od 1 do 2.

Wtedy moim schemacie DB stał się stabilny i dlatego, że nie zwalnia aplikację i to na własny użytek

Zdecydowałem aby ponownie zmienić wersję na 1.

Zrobiłem nową instalację i wszystko działało dobrze.

Ale wtedy uruchomiony po raz drugi rzuca ten błąd:

06-05 10:03:35.683: E/AndroidRuntime(9010): android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1 
06-05 10:03:35.683: E/AndroidRuntime(9010):  at android.database.sqlite.SQLiteOpenHelper.onDowngrade(SQLiteOpenHelper.java:361) 

Dlaczego jest to, że mimo wszystko nie mogę zainstalować świeży i DB powinny zostać usunięte, jak również. Nie?

Jak mogę zmienić wersję na 1?

+0

Wygląda na to, że tworzysz bazę danych z wersją 1 na starcie i aktualizujesz ją gdzieś podczas pracy. Potem ponownie uruchomisz aplikację i musisz ją zmienić. Kod pocztowy, w którym tworzysz swoją bazę danych. –

+0

http://stackoverflow.com/questions/15018025/cant-downgrade-database-from-version-2-to-1 – user

Odpowiedz

11

To jest wyjątek od następujących warunków:

  • Urządzenie że używasz kodu na ma pliku bazy danych w wersji 2.
  • Kod żąda wersji 1 (z bazy danych z parametrem do konstruktora SQLiteOpenHelper)
  • onDowngrade() nie jest nadpisany w kodzie.

Podobno kod zadziałał dobrze po raz pierwszy po nowej instalacji. Upewnij się, że nie ma innego kodu, który podważyłby numer wersji tego samego pliku bazy danych do 2 ponownie.

+1

Jakie są możliwe powody obniżenia wersji? –

+0

jakie pytanie Muhammad Babar ...! Cóż, ktoś chce usunąć kilka sprzecznych kolumn z bieżącego schematu, ktoś chce usunąć nieużywane kolumny, ktoś chce ponownie zdefiniować schemat z kilkoma nowymi kolumnami, a stare zrzucają i postanawia rzucić całość, a następnie uaktualnić? –

0

Nie pokazuje się, gdzie tworzona jest baza danych, czyli gdzie normalnie jest przypisana wersja bazy danych (np. SQLtorOpenHelper ctor).

Czy istnieje szansa, że ​​baza danych znajduje się w zewnętrznym systemie plików? Jeśli nie zastosujesz się do konwencji nazewnictwa, pliki te nie zostaną usunięte po usunięciu aplikacji.

0

Jak wykonałeś świeżą instalację?

  • adb install -r? W takim przypadku dane Twojej aplikacji, w tym bazy danych, nie zostaną dotknięte.
  • adb uninstall i adb install? Byłby to właściwy sposób na przeprowadzenie czystej instalacji. Wszystkie dane zostaną usunięte podczas uninstall, a twoja baza danych zostanie świeżo utworzona po pierwszym uruchomieniu po install.

Ale piszesz, że podczas pierwszego uruchomienia po świeżej instalacji zadziałało. Może to tylko oznaczać, że gdzieś nadal wykonuje aktualizację do wersji 2.

0

Aktualizacja: Przejdź do informacji o aplikacji i> Powinno również działać pamięć i dane.

Jednym z możliwych powodów, dla których działało po raz pierwszy, ale nie po raz drugi, może być to, że baza danych nie została wywołana w pierwszym uruchomieniu?

Również z Marshmallow dane aplikacji na Androida to automatically backed up. w przypadku aplikacji kierowanych na 23+, więc Twoja aplikacja mogła pobrać wcześniejszą bazę danych z chmury bez Twojej wiedzy.

Niestety, nie można jeszcze ręcznie usunąć danych aplikacji. Ale jeśli nie masz nic przeciwko zabijaniu kopii zapasowych danych dla wszystkich aplikacji, możesz odinstalować aplikację, a następnie rozwinąć sekcję Android i usunąć dane z kopii zapasowej aplikacji.

Po tym, powinieneś być w stanie ponownie zainstalować aplikację i uzyskać nową, świeżą bazę danych.

To zadziałało dla mnie, ale rób to na własne ryzyko.

1

Możesz zastąpić onDowngrade() przez siebie, jeśli chcesz mieć możliwość uruchamiania aplikacji z bazą danych na urządzeniu o wyższej wersji, niż twój kod może obsłużyć.

Jest to domyślna implementacja z onDowngrage():

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    throw new SQLiteException("Can't downgrade database from version " + 
      oldVersion + " to " + newVersion); 
} 

Jeśli trzeba zastąpić tę metodę należy przeczytać this question also.

Bez przesłonięcia tej metody nie można zmniejszyć wersji SQLite po zwiększeniu i wykonaniu. Więc trzeba zmienić z powrotem do 2 lub większa niż 2:

public DatabaseHelper(Context context) { 
    super(context, DB_NAME, null, 2); 
} 

Jeśli próbujesz zaktualizować tabelę prawdopodobnie trzeba przejść 3 nie 2 i za każdym razem trzeba aktualizować tabeli, musisz zwiększyć wersję (nie zmniejszać).

0

Oznacza to, że istnieje już wcześniejszy plik i próbujesz utworzyć inny o tej samej nazwie, możesz zmienić nazwę bazy danych lub na urządzeniu, którego emulujesz, odinstalować aplikację i ponownie ją emulować .