SQLiteOpenHelper
onCreate()
a onUpgrade()
zpětná volání jsou vyvolána, když je databáze skutečně otevřena, například voláním getWritableDatabase()
. Databáze se neotevře, když je vytvořen samotný pomocný objekt databáze.
SQLiteOpenHelper
verze databázových souborů. Číslo verze je int
argument předaný konstruktoru. V databázovém souboru je číslo verze uloženo v PRAGMA user_version
.
onCreate()
se spouští pouze v případě, že databázový soubor neexistoval a byl právě vytvořen. Pokud onCreate()
vrátí úspěšně (nevyvolá výjimku), předpokládá se, že databáze je vytvořena s požadovaným číslem verze. Z toho vyplývá, že byste neměli zachytit SQLException
s v onCreate()
sebe.
onUpgrade()
je voláno pouze tehdy, když databázový soubor existuje, ale uložené číslo verze je nižší, než požaduje konstruktor. onUpgrade()
by měl aktualizovat schéma tabulky na požadovanou verzi.
Při změně schématu tabulky v kódu (onCreate()
), měli byste se ujistit, že je databáze aktualizována. Dva hlavní přístupy:
-
Smažte starý databázový soubor tak, aby
onCreate()
je znovu spuštěn. To je často preferováno v době vývoje, kdy máte kontrolu nad nainstalovanými verzemi a ztráta dat nepředstavuje problém. Některé způsoby odstranění databázového souboru:-
Odinstalujte aplikaci. Použijte správce aplikací nebo
adb uninstall your.package.name
ze skořápky. -
Vymazat data aplikace. Použijte správce aplikací.
-
-
Zvyšte verzi databáze tak, aby
onUpgrade()
je vyvoláno. To je trochu složitější, protože je potřeba více kódu.-
Pro upgrady vývojového schématu, kde ztráta dat nepředstavuje problém, stačí použít
execSQL("DROP TABLE IF EXISTS <tablename>")
in k odstranění vašich stávajících tabulek a voláníonCreate()
znovu vytvořit databázi. -
U vydaných verzí byste měli implementovat migraci dat v
onUpgrade()
aby vaši uživatelé nepřišli o svá data.
-