Utworzyłem już tabele sqlite dla mojej aplikacji, ale teraz chcę dodać nową tabelę do bazy danych.
Zmieniłem wersję DB jak poniżej
private static final int DATABASE_VERSION = 2;
i Dodano ciąg do utworzenia tabeli
private static final String DATABASE_CREATE_color =
"CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";
onCreate
i onUpgrade
jak poniżej:
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE_incident);
database.execSQL(DATABASE_CREATE_audio);
database.execSQL(DATABASE_CREATE_video);
database.execSQL(DATABASE_CREATE_image);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//drop table and add new tables when version 2 released.
db.execSQL(DATABASE_CREATE_color);
}
Ale z jakiegoś powodu nowa tabela nie jest tworzona. Co ja robię źle?
Odpowiedzi:
1. Informacje o onCreate () i onUpgrade ()
onCreate(..)
jest wywoływana za każdym razem, gdy aplikacja jest świeżo zainstalowana.onUpgrade
jest wywoływana za każdym razem, gdy aplikacja jest aktualizowana i uruchamiana, a wersja bazy danych nie jest taka sama.2. Zwiększanie wersji db
Potrzebujesz konstruktora takiego jak:
WAŻNE: Samo zwiększenie wersji aplikacji nie wystarczy,
onUpgrade
aby zadzwonić!3. Nie zapomnij o nowych użytkownikach!
Nie zapomnij dodać
do metody onCreate () lub w przypadku nowo zainstalowanych aplikacji będzie brakować tabeli.
4. Jak radzić sobie z wieloma zmianami bazy danych w czasie
W przypadku kolejnych uaktualnień aplikacji, z których kilka obejmuje uaktualnienia bazy danych, należy sprawdzić
oldVersion
:W ten sposób, gdy użytkownik zaktualizuje wersję 1 do wersji 3, otrzyma obie aktualizacje. Kiedy użytkownik uaktualnia z wersji 2 do 3, po prostu otrzymuje aktualizację do wersji 3 ... W końcu nie możesz liczyć na to, że 100% bazy użytkowników dokona aktualizacji za każdym razem, gdy wydasz aktualizację. Czasami pomijają aktualizację lub 12 :)
5. Utrzymywanie pod kontrolą numerów wersji podczas programowania
I wreszcie… dzwoni
całkowicie odinstalowuje aplikację. Po ponownej instalacji masz gwarancję trafienia,
onCreate
dzięki czemu nie będziesz musiał zwiększać wersji bazy danych do stratosfery podczas opracowywania ...źródło
oldVersion
przekazanego argumentu? Jeśli jakiekolwiek instrukcje dotyczące aktualizacji są powtarzalne, możesz skończyć powtarzając je w większości aktualnej bazy danych. Jeśli jedno z instrukcji ma na celu obcięcie tabeli, byłoby to bardzo złe.newVersion
jest trochę bezużyteczna, ponieważ i tak zawsze ustawiasz aktualną wersję bazy danych w konstruktorze (patrz część 2) i zawsze będzie pasować. Kluczową ideą jest to, że nie chcesz po prostu aktualizować z miejsca, w którym użytkownik jest prosto,newVersion
bez przechodzenia przez wszystkie inne przyrostowe aktualizacje pomiędzy.CREATE_READINGS
Logika nigdy nie powinna znajdować się w onUpgrade, ponieważ była wonCreate
metodzie pierwszej wersji. Pomyśl o przypadkach wonUpgrade
przełączniku jako „Uaktualniam ODoldVersion
”. Nie utworzyłbyś tabeli odczytów, gdybyś przeprowadzał aktualizację z wersji 1, ponieważ powinna już istnieć. Miejmy nadzieję, że to ma sens ...Twój kod wygląda na prawidłowy. Moja sugestia jest taka, że baza danych już myśli, że jest zaktualizowana. Jeśli wykonałeś projekt po zwiększeniu numeru wersji, ale przed dodaniem
execSQL
wywołania, baza danych na urządzeniu testowym / emulatorze może już sądzić, że jest w wersji 2.Szybkim sposobem na sprawdzenie tego byłaby zmiana numeru wersji na 3 - jeśli później się zaktualizuje, wiesz, że to tylko dlatego, że Twoje urządzenie wierzyło, że zostało już zaktualizowane.
źródło
onCreate()
jak wskazał jkschneider.Możesz użyć
onUpgrade
metody SQLiteOpenHelper . W metodzie onUpgrade jako jeden z parametrów otrzymujesz oldVersion.W przypadku
onUpgrade
używaniaswitch
ai w każdym zcase
s użyj numeru wersji, aby śledzić aktualną wersję bazy danych.Najlepiej jest
oldVersion
wykonać pętlę od donewVersion
, zwiększającversion
ją o 1, a następnie aktualizując bazę danych krok po kroku. Jest to bardzo pomocne, gdy ktoś z bazą danych w wersji 1 uaktualnia aplikację po długim czasie do wersji korzystającej z bazy danych w wersji 7, a aplikacja zaczyna się zawieszać z powodu pewnych niezgodnych zmian.Następnie aktualizacje w bazie danych będą wykonywane krok po kroku, obejmując wszystkie możliwe przypadki, tj. Wprowadzając zmiany w bazie danych wykonane dla każdej nowej wersji i tym samym zapobiegając awariom aplikacji.
Na przykład:
źródło
Odpowiedź @ jkschneider jest prawidłowa. Jest jednak lepsze podejście.
Zapisz potrzebne zmiany w pliku sql dla każdej aktualizacji, jak opisano w linku https://riggaroo.co.za/android-sqlite-database-use-onupgrade-correctly/
from_1_to_2.sql
from_2_to_3.sql
from_3_to_4.sql
Te pliki .sql zostaną wykonane metodą onUpgrade () zgodnie z wersją bazy danych.
DatabaseHelper.java
Przykładowy projekt znajduje się w tym samym linku również: https://github.com/riggaroo/AndroidDatabaseUpgrades
źródło
Obsługa wersji baz danych jest bardzo ważną częścią tworzenia aplikacji. Zakładam, że masz już rozszerzającą klasę AppDbHelper
SQLiteOpenHelper
. Kiedy go rozszerzysz, będziesz musiał wdrożyćonCreate
ionUpgrade
metody.Kiedy
onCreate
ionUpgrade
metody wywołaneonCreate
wywoływana, gdy aplikacja jest nowo zainstalowana.onUpgrade
wywoływana po aktualizacji aplikacji.Organizowanie wersji baz danych Zarządzam wersjami w metodach klasowych. Stwórz implementację interfejsu Migration. Np. Dla pierwszej wersji create
MigrationV1
class, druga wersja createMigrationV1ToV2
(taka jest moja konwencja nazewnictwa)Przykładowa migracja:
onCreate
: PonieważonCreate
zostanie wywołany, gdy aplikacja zostanie świeżo zainstalowana, musimy również wykonać wszystkie migracje (aktualizacje wersji bazy danych). WięconCreate
będzie wyglądać tak:onUpgrade
: Ta metoda zostanie wywołana, gdy aplikacja zostanie już zainstalowana i zostanie zaktualizowana do nowej wersji aplikacji. Jeśli aplikacja zawiera jakiekolwiek zmiany w bazie danych, umieść wszystkie zmiany w nowej klasie migracji i zwiększonej wersji bazy danych.Na przykład, powiedzmy, że użytkownik zainstalował aplikację, która ma wersję bazy danych 1, a teraz wersja bazy danych jest aktualizowana do 2 (wszystkie aktualizacje schematu są zachowane
MigrationV1ToV2
). Teraz, gdy aplikacja jest aktualizowana, musimy zaktualizować bazę danych, stosując zmiany schematu bazy danych wMigrationV1ToV2
następujący sposób:źródło