sql >> Databasteknik >  >> RDS >> SQLite

När körs SQLiteOpenHelper onCreate() / onUpgrade()?

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:

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

  2. Ö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 anropa onCreate() 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.



  1. Byt namn på Oracle-tabell eller vy

  2. mysql error 1364 Fältet har inga standardvärden

  3. Varning:mysql_connect():[2002] Ingen sådan fil eller katalog (försöker ansluta via unix:///tmp/mysql.sock) i

  4. MySQL UNION-klausul