SQLiteOpenHelper
onCreate()
och onUpgrade()
callbacks anropas när databasen faktiskt öppnas, till exempel genom ett anrop till getWritableDatabase()
. Databasen öppnas inte när själva databashjälpobjektet skapas.
SQLiteOpenHelper
versioner av databasfilerna. Versionsnumret är int
argumentet skickas till konstruktören. I databasfilen lagras versionsnumret i PRAGMA user_version
.
onCreate()
körs bara när databasfilen inte fanns och just skapades. Om onCreate()
returnerar framgångsrikt (ger inget undantag), antas databasen skapas med det begärda versionsnumret. Som en implikation bör du inte fånga SQLException
s i onCreate()
dig själv.
onUpgrade()
anropas endast när databasfilen finns men det lagrade versionsnumret är lägre än vad som begärts i konstruktorn. onUpgrade()
bör uppdatera tabellschemat till den begärda versionen.
När du ändrar tabellschemat i kod (onCreate()
), bör du se till att databasen är uppdaterad. Två huvudsakliga tillvägagångssätt:
-
Ta bort den gamla databasfilen så att
onCreate()
körs igen. Detta är ofta att föredra vid utvecklingstid där du har kontroll över de installerade versionerna och dataförlust inte är ett problem. Några sätt att ta bort databasfilen:-
Avinstallera programmet. Använd applikationshanteraren eller
adb uninstall your.package.name
från skalet. -
Rensa applikationsdata. Använd applikationshanteraren.
-
-
Öka databasversionen så att
onUpgrade()
åberopas. Detta är något mer komplicerat eftersom mer kod behövs.-
För uppgraderingar av utvecklingstidsscheman där dataförlust inte är ett problem kan du bara använda
execSQL("DROP TABLE IF EXISTS <tablename>")
in för att ta bort dina befintliga tabeller och anropaonCreate()
för att återskapa databasen. -
För släppta versioner bör du implementera datamigrering i
onUpgrade()
så att dina användare inte förlorar sin data.
-