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

Hvornår kører SQLiteOpenHelper onCreate() / onUpgrade()?

SQLiteOpenHelper onCreate() og onUpgrade() tilbagekald påkaldes, når databasen faktisk åbnes, for eksempel ved et kald til getWritableDatabase() . Databasen åbnes ikke, når selve databasehjælpeobjektet oprettes.

SQLiteOpenHelper versioner af databasefilerne. Versionsnummeret er int argumentet videregivet til konstruktøren. I databasefilen er versionsnummeret gemt i PRAGMA user_version .

onCreate() køres kun, når databasefilen ikke eksisterede og lige blev oprettet. Hvis onCreate() returnerer med succes (udløser ikke en undtagelse), antages databasen at være oprettet med det anmodede versionsnummer. Som en implikation bør du ikke fange SQLException s i onCreate() dig selv.

onUpgrade() kaldes kun, når databasefilen eksisterer, men det lagrede versionsnummer er lavere end anmodet i konstruktøren. onUpgrade() bør opdatere tabelskemaet til den ønskede version.

Når du ændrer tabelskemaet i kode (onCreate() ), skal du sørge for, at databasen er opdateret. To hovedtilgange:

  1. Slet den gamle databasefil, så onCreate() køres igen. Dette foretrækkes ofte på udviklingstidspunktet, hvor du har kontrol over de installerede versioner, og tab af data ikke er et problem. Nogle måder at slette databasefilen på:

    • Afinstaller applikationen. Brug applikationsadministratoren eller adb uninstall your.package.name fra skallen.

    • Ryd applikationsdata. Brug applikationsadministratoren.

  2. Forøg databaseversionen, så onUpgrade() er påberåbt. Dette er lidt mere kompliceret, da der er brug for mere kode.

    • Til udviklingstidsskemaopgraderinger, hvor datatab ikke er et problem, kan du bare bruge execSQL("DROP TABLE IF EXISTS <tablename>") ind for at fjerne dine eksisterende tabeller og kalde onCreate() for at genskabe databasen.

    • For frigivne versioner bør du implementere datamigrering i onUpgrade() så dine brugere ikke mister deres data.



  1. Skemamønstersøgning til dataklasseforening

  2. Hvorfor producerer en parameteriseret forespørgsel meget langsommere forespørgselsplan i forhold til ikke-parameteriseret forespørgsel

  3. Hvordan bruger man Alias ​​i Where-klausulen?

  4. i postgres, kan du indstille standardformateringen for et tidsstempel, efter session eller globalt?