sql >> Databáze >  >> RDS >> SQLite

Kdy se spustí SQLiteOpenHelper onCreate() / onUpgrade()?

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:

  1. 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í.

  2. 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.



  1. programově kontroluje otevřené připojení v JDBC

  2. PDO MySQL:Použít PDO::ATTR_EMULATE_PREPARES nebo ne?

  3. Reprezentace dat, časů a intervalů v PostgreSQL

  4. Co je MySQL ekvivalentem PostgreSQL EXPLAIN ANALYZE