Utworzyłem swoje tabele w moim, SQLiteOpenHelper
onCreate()
ale otrzymuję
SQLiteException: no such table
lub
SQLiteException: no such column
błędy. Dlaczego?
UWAGA:
(To jest połączone podsumowanie dziesiątek podobnych pytań co tydzień. Próba dostarczenia „kanonicznego” pytania / odpowiedzi na wiki społeczności, aby wszystkie te pytania mogły zostać skierowane do dobrego źródła).
Odpowiedzi:
SQLiteOpenHelper
onCreate()
aonUpgrade()
wywołania zwrotne są wywoływane podczas faktycznego otwarcia bazy danych, na przykład przez wywołanie dogetWritableDatabase()
. Baza danych nie jest otwierana podczas tworzenia samego obiektu pomocnika bazy danych.SQLiteOpenHelper
wersje plików bazy danych. Numer wersji jestint
argumentem przekazywanym do konstruktora . W pliku bazy danych numer wersji jest zapisany wPRAGMA user_version
.onCreate()
jest uruchamiany tylko wtedy, gdy plik bazy danych nie istniał i został właśnie utworzony. JeślionCreate()
zwraca pomyślnie (nie zgłasza wyjątku), zakłada się, że baza danych została utworzona z żądanym numerem wersji. Implikacją jest to, że nie powinieneś łapać sięSQLException
wonCreate()
sobie.onUpgrade()
jest wywoływany tylko wtedy, gdy plik bazy danych istnieje, ale zapisany numer wersji jest niższy niż wymagany w konstruktorze.onUpgrade()
Powinien zaktualizować schematu tabeli do wersji wniosku.Zmieniając schemat tabeli w code (
onCreate()
), należy upewnić się, że baza danych jest zaktualizowana. Dwa główne podejścia:Usuń stary plik bazy danych, aby
onCreate()
został ponownie uruchomiony. Jest to często preferowane w czasie programowania, gdy masz kontrolę nad zainstalowanymi wersjami, a utrata danych nie stanowi problemu. Niektóre sposoby usunięcia pliku bazy danych:Odinstaluj aplikację. Użyj menedżera aplikacji lub
adb uninstall your.package.name
z powłoki.Wyczyść dane aplikacji. Użyj menedżera aplikacji.
Zwiększ wersję bazy danych, aby
onUpgrade()
została wywołana. Jest to nieco bardziej skomplikowane, ponieważ potrzeba więcej kodu.W przypadku aktualizacji schematu czasu programowania, w których utrata danych nie stanowi problemu, można po prostu użyć
execSQL("DROP TABLE IF EXISTS <tablename>")
do usunięcia istniejących tabel i wywołaćonCreate()
odtworzenie bazy danych.W wydanych wersjach należy wdrożyć migrację danych,
onUpgrade()
aby użytkownicy nie stracili swoich danych.źródło
onUpdate()
, sprawdź każdą starą wersję i wykonaj właściwą migrację danych. A następnie, gdy użytkownik zaktualizuje swoją aplikację (mają stare pliki db),onUpgrade
zostanieonCreate()
wyzwolony , a jeśli użytkownik zostanie nowo zainstalowany, zostanie wyzwolony.Aby dodać tutaj brakujące punkty, zgodnie z prośbą Jaskeya
Wersja bazy danych jest przechowywana w
SQLite
pliku bazy danych.catch jest konstruktorem
Tak więc gdy wywoływany jest konstruktor pomocnika bazy danych z
name
(2. parametr), platforma sprawdza, czy baza danych istnieje, czy nie, a jeśli baza istnieje, pobiera informacje o wersji z nagłówka pliku bazy danych i wyzwala właściwe oddzwonienieJak już wyjaśniono w starszej odpowiedzi, jeśli baza danych o nazwie nie istnieje, uruchamia się
onCreate
.Poniżej wyjaśnienie wyjaśnia
onUpgrade
przypadek na przykładzie.Powiedzmy, że Twoja pierwsza wersja aplikacji miała
DatabaseHelper
(rozszerzającą sięSQLiteOpenHelper
) wersję konstruktora przekazującą as,1
a następnie dostarczyłeś uaktualnioną aplikację z nowym kodem źródłowym, którego wersja została przekazana jako2
, a następnie automatycznie poDatabaseHelper
zbudowaniu platforma uruchamiaonUpgrade
się, widząc, że plik już istnieje, ale wersja jest niższa niż bieżąca wersja, którą przeszedłeś.Powiedzmy teraz, że planujesz podać trzecią wersję aplikacji w wersji db jako
3
(wersja db jest zwiększana tylko wtedy, gdy schemat bazy danych ma zostać zmodyfikowany). W takich przyrostowych aktualizacjach musisz zapisywać logikę aktualizacji z każdej wersji przyrostowo, aby uzyskać łatwiejszy do utrzymania kodPrzykładowy pseudo kod poniżej:
Zauważ brak
break
instrukcję w przypadku1
i2
. To właśnie rozumiem przez przyrostową aktualizację.Powiedz, czy stara wersja jest,
2
a nowa wersja jest4
, to logika zaktualizuje bazę danych z2
do,3
a następnie do4
Jeśli stara wersja
3
i nowa wersja jest4
, to wystarczy uruchomić aktualizację logikę3
do4
źródło
onCreate()
Kiedy tworzymy bazę danych po raz pierwszy (tzn. Baza danych nie istnieje),
onCreate()
utwórz bazę danych z przekazaną wersjąSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
Metoda polega na utworzeniu tabel, które zdefiniowałeś i wykonaniu dowolnego napisanego kodu. Jednak ta metoda zostanie wywołana tylko wtedy, gdy brakuje pliku SQLite w katalogu danych aplikacji (/data/data/your.apps.classpath/databases
).Ta metoda nie zostanie wywołana, jeśli zmieniłeś kod i ponownie uruchomiłeś emulator. Jeśli chcesz
onCreate()
uruchomić, musisz użyć adb, aby usunąć plik bazy danych SQLite.onUpgrade()
SQLiteOpenHelper
powinien wywołać superkonstruktora.onUpgrade()
Metoda zostanie wywołana tylko wtedy, gdy wersja liczba całkowita jest większa od bieżącej wersji działającej w aplikacji.onUpgrade()
wywołać metodę, musisz zwiększyć numer wersji w kodzie.źródło
Być może spóźniłem się, ale chciałbym podzielić się moją krótką i słodką odpowiedzią. Sprawdź odpowiedź na ten sam problem. To na pewno ci pomoże. Nigdy więcej szczegółowych specyfikacji.
Jeśli masz pewność co do składni tworzenia tabeli, to może się zdarzyć, gdy dodasz nową kolumnę w tej samej tabeli, dlatego ...
1) Odinstaluj urządzenie i uruchom je ponownie.
LUB
2) Ustawienia -> aplikacja -> ClearData
LUB
3) Zmiana
DATABASE_VERSION
w klasie „DatabaseHandler” (jeśli dodałeś nową kolumnę, nastąpi automatyczna aktualizacja)LUB
4) Zmiana
DATABASE_NAME
w klasie „DatabaseHandler” (napotkałem ten sam problem. Ale zmieniam sięDATABASE_NAME
.)źródło
Punkty do zapamiętania przy przedłużaniu
SQLiteOpenHelper
super(context, DBName, null, DBversion);
- Należy wywołać pierwszą linię konstruktoraonCreate
ionUpgrade
(w razie potrzeby)onCreate
będą wywoływane tylko po wykonaniugetWritableDatabase()
lubgetReadableDatabase()
. I to zostanie wywołane tylko raz, gdyDBName
określony w pierwszym kroku nie będzie dostępny. Możesz dodać opcję tworzenia zapytania tabeli wonCreate
metodzieDBversion
i wykonaj zapytania wonUpgrade
tabeli lub po prostu odinstaluj, a następnie zainstaluj aplikację.źródło
Program onCreate jest wywoływany po raz pierwszy, gdy potrzebne jest tworzenie tabel. Musimy zastąpić tę metodę, w której piszemy skrypt do tworzenia tabeli, który jest wykonywany przez SQLiteDatabase. metoda execSQL. Po pierwszym wdrożeniu metoda ta nie będzie wywoływana dalej.
onUpgrade Ta metoda jest wywoływana przy aktualizacji wersji bazy danych. Załóżmy, że przy pierwszym wdrożeniu wersja bazy danych miała numer 1, a przy drugim wdrożeniu nastąpiła zmiana struktury bazy danych, np. Dodanie dodatkowej kolumny w tabeli. Załóżmy, że wersja bazy danych ma teraz 2.
źródło
Możesz stworzyć bazę danych i tabelę
Uwaga: jeśli chcesz utworzyć inną tabelę lub dodać kolumny lub nie ma takiej tabeli, po prostu zwiększ WERSJĘ
źródło
Baza danych Sqlite przesłania dwie metody
1) onCreate (): Ta metoda została wywołana tylko raz przy pierwszym uruchomieniu aplikacji. Więc zadzwonił tylko raz
2) onUpgrade () Ta metoda wywoływana podczas zmiany wersji bazy danych, a następnie wywoływana jest ta metoda. Jest używana do zmiany struktury tabeli, np. Dodawania nowej kolumny po utworzeniu schematu DB
źródło
taka tabela nie została znaleziona głównie wtedy, gdy nie otworzyłeś
SQLiteOpenHelper
klasy,getwritabledata()
a przed tym musisz także wywołać make constructor z nazwą bazy danych i wersją. IOnUpgrade
jest wywoływany, ilekroć w wersji podana jest wartość aktualizacji podana wSQLiteOpenHelper
klasie.Poniżej znajduje się fragment kodu (nie znaleziono takiej kolumny z powodu pisowni w nazwie kolumny):
źródło
Jeśli zapomnisz podać ciąg „nazwa” jako drugi argument konstruktora, utworzy on bazę danych „w pamięci”, która zostanie wymazana po zamknięciu aplikacji.
źródło
Odinstaluj aplikację z emulatora lub urządzenia. Uruchom aplikację ponownie. (OnCreate () nie jest wykonywany, gdy baza danych już istnieje)
źródło
Nazwa bazy danych musi kończyć się .db, a także ciągi zapytań muszą mieć terminator (;)
źródło
Sprawdź ponownie zapytanie w swojej klasie DatabaseHandler / DatabaseManager (którą kiedykolwiek wziąłeś)
źródło
W moim przypadku otrzymuję elementy z pliku XML
<string-array>
, w którym przechowuję<item>
s. W tych<item>
trzymam ciągi SQL i stosuję je pojedynczodatabaseBuilder.addMigrations(migration)
. Popełniłem jeden błąd, zapomniałem dodać\
przed cytatem i dostałem wyjątek:android.database.sqlite.SQLiteException: brak takiej kolumny: some_value (kod 1 SQLITE_ERROR):, podczas kompilacji: INSERT INTO nazwa_tabeli (id, nazwa) VALUES (1, some_value)
To jest właściwy wariant:
źródło
Metoda Sqliteopenhelpera ma metody tworzenia i aktualizacji, metoda tworzenia jest używana, gdy dowolna tabela jest tworzona po raz pierwszy, a metoda aktualizacji będzie wywoływana za każdym razem, gdy zmieni się numer kolumny kolumny.
źródło