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:
-
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.
-
-
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 chiamareonCreate()
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.
-