2012-10-31 13 views
6

Stworzyłem aplikację dla systemu Android, która po uruchomieniu sprawdza, czy jest nowa wersja aplikacji. Jeśli tak, aplikacja pobiera nowy plik apk i instaluje nową apk. Moja aplikacja korzysta z bazy danych sqlite db. Ale ta db z jednej wersji do drugiej może się zmienić. Chyba trzeba użyć metody:onUpgrade() baza danych sqlite w systemie Android

onUpgrade() 

ale nie wiem dokładnie, jak go używać.

Kiedy uruchomić aplikację używam tego kodu do bazy Krecie (jeśli nie istnieje):

DbHelper mDHelper = new DbHelper(context, DB_NAME, null, DB_VERSION) 

Co należy zmienić, jeśli chcę użyć onUpgrade() metody? A kiedy mam to nazwać?

+1

numer wersji – njzk2

Odpowiedz

17

onUpgrade() nazywa (nie nazywają siebie), gdy wersja Twojego DB zmieniła, co oznacza bazowy struktura stół zmienił itp

Na ogół oznacza to, że system operacyjny jest informacją "hej, poprosił o bazie struktura wersji 10, ale znalazłem, że mamy tu coś starszego, więc masz szansę to naprawić, zanim zaczniesz korzystać z bazy danych (i potencjalnie awarii z powodu niedopasowania struktury) ".

W tej metodzie powinieneś zrobić wszystko, co jest konieczne, aby ... zaktualizować strukturę starej bazy danych do struktury zgodnej z aktualnymi wymaganiami dotyczącymi wersji, takich jak dodawanie/upuszczanie kolumn, konwertowanie zawartości wiersza lub nawet całkowite upuszczenie starej bazy danych i utworzenie jej z poziomu scratch - dla Androida nie ma znaczenia, co tu robisz - to tylko rodzaj awaryjnego oddzwaniania twojego kodu, aby wykonać niezbędne zadanie (jeśli jest). Musisz mieć świadomość, że użytkownicy mogą nie aktualizować się często, więc musisz zawsze obsługiwać upgrade z wersji X do Y, wiedząc, że X może nie być równy, tj. (Y-1).

+1

Zauważam, że onUpgrade przyjmuje dwa parametry: oldVersion i newVersion. Więc jeśli mam w mojej aplikacji, baza danych w wersji 1 i pobrany plik APK zawiera bazę danych w wersji 2, to pozwala systemowi na automatyczne wywoływanie metody onUpgrade()? – GVillani82

+0

Zgodnie z sugestią pod adresem http://code.google.com/p/openintents/source/browse/trunk/notepad/NotePad/src/org/openintents/notepad/NotePadProvider.java?r=3878 Mogę użyć przełącznika (oldVersion) w celu uwzględnienia różnych zmian wprowadzanych dla każdej starej wersji? czy to jest poprawne? Ponadto, jeśli w nowej wersji db dodaję nową kolumnę do jakiejś tabeli, muszę zmodyfikować także onCreate, aby utworzyć tabelę z nową dodatkową kolumną?To prawdopodobnie ma sens, jeśli żadna aplikacja nie jest jeszcze zainstalowana i konieczne jest utworzenie nowej bazy danych. Czy moje założenie jest poprawne? – GVillani82

+2

tak. numer wersji to po prostu 'int', więc możesz zrobić zwykły' switch/case'. Najważniejsze jest jednak to, że na przykład będziesz obsługiwał upgrade z wersji 2 do 3, ale także od 1 do 3 (prawdopodobnie po prostu wykonam pętlę i najpierw dokonam aktualizacji z 1 na 2, a następnie z 2 na 3), co prawdopodobnie być prostsze niż obsługa bezpośredniej aktualizacji od 1 do 3 (lub od 1 do 80, aby dać szerszą perspektywę) –

4

jeśli używasz SQLiteOpenHelper, onUpgrade będzie wywoływana za każdym razem, gdy zmienisz wersję DB. Istnieje dodatkowe wymaganie, aby to zadziałało. Nazwa bazy danych musi pozostać taka sama.

Old Version: 
dbName = "mydb.db" 
dbVersion = 1 

New Version: 
dbName = "mydb.db" 
dbVersion = 2 

w onCreate dostawcy treści tworzysz wystąpienie SQLiteOpenHelper, które pobiera te parametry. Implementacja SQLiteOpenHelper będzie wyglądać następująco:

public static final class MySQLiteOpenHelper extends SQLiteOpenHelper { 

     public MySQLiteOpenHelper(Context context, int dbVersion, String dbName) { 
      super(context, dbName, null, dbVersion); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      //Code to create your db here 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // Code to upgrade your db here 
     } 

} 

zostanie on również nazywany kiedy zmieniają ci stolik lub dodać więcej tabel w bazie danych

Powiązane problemy