SQLite
 sql >> Database >  >> RDS >> SQLite

Quando viene eseguito SQLiteOpenHelper onCreate() / onUpgrade()?

SQLiteOpenHelper onCreate() e onUpgrade() i callback vengono invocati quando il database viene effettivamente aperto, ad esempio tramite una chiamata a getWritableDatabase() . Il database non viene aperto quando viene creato l'oggetto di supporto del database stesso.

SQLiteOpenHelper versioni dei file di database. Il numero di versione è int argomento passato al costruttore. Nel file di database, il numero di versione è memorizzato in PRAGMA user_version .

onCreate() viene eseguito solo quando il file di database non esisteva ed è stato appena creato. Se onCreate() restituisce correttamente (non genera un'eccezione), si presume che il database sia stato creato con il numero di versione richiesto. Come implicazione, non dovresti catturare SQLException s in onCreate() te stesso.

onUpgrade() viene chiamato solo quando il file di database esiste ma il numero di versione memorizzato è inferiore a quello richiesto nel costruttore. Il onUpgrade() dovrebbe aggiornare lo schema della tabella alla versione richiesta.

Quando si modifica lo schema della tabella nel codice (onCreate() ), dovresti assicurarti che il database sia aggiornato. Due approcci principali:

  1. Elimina il vecchio file di database in modo che onCreate() viene eseguito di nuovo. Questo è spesso preferito in fase di sviluppo in cui hai il controllo sulle versioni installate e la perdita di dati non è un problema. Alcuni modi per eliminare il file di database:

    • Disinstalla l'applicazione. Usa il gestore applicazioni o adb uninstall your.package.name dalla shell.

    • Cancella i dati dell'applicazione. Usa il gestore applicazioni.

  2. Incrementa la versione del database in modo che onUpgrade() viene invocato. Questo è leggermente più complicato in quanto è necessario più codice.

    • Per gli aggiornamenti dello schema del tempo di sviluppo in cui la perdita di dati non è un problema, puoi semplicemente usare execSQL("DROP TABLE IF EXISTS <tablename>") in per rimuovere le tabelle esistenti e chiamare onCreate() per ricreare il database.

    • Per le versioni rilasciate, dovresti implementare la migrazione dei dati in onUpgrade() in modo che i tuoi utenti non perdano i loro dati.