Potpuni vodič za izvođenje migracija baze podataka s prostorom

  • Razlika između korištenja automatskih migracijskih puteva za jednostavne promjene i ručnih migracijskih puteva za složenu logiku.
  • Važnost izvoza sheme u JSON formatu za validaciju strukture i olakšavanje testiranja.
  • Implementacija destruktivnih strategija sigurnosnog kopiranja i prethodno učitavanje podataka iz unaprijed zapakiranih datoteka.

Migracije baze podataka s prostorijom

Kada razvijate aplikaciju, sasvim je normalno da se potrebe projekta razvijaju. Kako dodajete značajke, shvatit ćete da Klase entiteta sobe i njihove odgovarajuće tablice moraju se promijeniti kako bi se prilagodile novim zahtjevima. Veliki izazov ovdje je osigurati da korisnik ne izgubi nikakve podatke kada se aplikacija ažurira i shema baze podataka se promijeni.

Kako bi se to riješilo, Room nudi niz opcija, od najjednostavnijih do složenijih implementacija. Ovisno o tome je li promjena jednostavno dodavanje stupaca ili potpuno restrukturiranje, možete birati između automatske ili ručne migracijeuvijek osiguravajući da je prijelaz besprijekoran i da ne uzrokuje neočekivano zatvaranje aplikacije.

Brzi put: Automatske migracije

Počevši od verzije 2.4.0-alpha01, Room nam pojednostavljuje život automatskim migracijama. U osnovi, okvir analizira razlike između stare i nove verzije i generira nam plan migracije. Za aktivaciju jednostavno dodajte napomenu. @AutomatskaMigracija unutar svojstva autoMigrations u dekoratoru @Database.

Imajte na umu da postoji ključni detalj: da bi ovo funkcioniralo, exportSchema mora biti postavljen na trueAko niste izvezli shemu ili kompajlirali bazu podataka s novim brojem verzije, Room neće znati što se promijenilo i migracija će spektakularno propasti.

Migracije baze podataka s prostorijom
Povezani članak:
Potpuni vodič za složene odnose i upite u sobama i relacijskim bazama podataka

Složeni slučajevi u automatskom načinu rada

Ponekad Room malo zakaže i otkrije dvosmislene promjene, poput kada odlučite izbrisati tablicu ili preimenovati stupac. U tim slučajevima, kompajler će izbaciti grešku i zatražiti od vas da implementirate Specifikacija automatske migracijeU ovoj statičkoj klasi dajete Roomu dodatne informacije koje su mu potrebne kako se ne bi izgubio.

Unutar ove specifikacije možete koristiti napomene kao što su @PreimenujTable za vođenje sustava. Osim toga, ako trebate pokrenuti dodatni kod nakon što je automatska migracija dovršena, na raspolaganju vam je sljedeća metoda. prilikomPostMigrate()što je idealno za konačne prilagodbe podataka.

Potpuna kontrola: Ručne migracije

Postoje situacije u kojima automatizacija ne uspijeva, na primjer kada trebate podijeliti podatke iz tablice u dva odvojena entiteta. Tu dolaze do izražaja ručne migracije, stvaranjem klase koja nasljeđuje od Migracija i gdje nadjačavate metodu migrate().

U ovoj metodi imate objekt SupportSQLiteDatabase koji vam omogućuje izravno izvršavanje SQL naredbi. Na primjer, za dodavanje stupca koristili biste ALTER TABLEVažno je da prilikom registracije ovih ruta u alatu za izradu baze podataka koristite metodu dodajMigracije().

Zlatni savjet: izbjegavajte korištenje Kotlin konstanti unutar SQL migracijskih upita; pišite potpuni SQL upitiTo sprječava katastrofalne pogreške ako u budućnosti promijenite vrijednost konstante, ali stara migracija i dalje treba izvornu vrijednost.

Napredne strategije i upravljanje greškama

Ako se nađete u situaciji u kojoj ne možete definirati put migracije i ne smeta vam da se podaci izbrišu (jer bi to mogla biti samo predmemorija), možete koristiti povratNaDestruktivnuMigraciju()Zbog toga Room briše sve i ponovno stvara tablice od nule, sprječavajući rušenje aplikacije s IllegalStateException.

Za bolju kontrolu postoje alternative kao što su povratNaDestruktivnuMigracijuIz()koji briše podatke samo ako korisnik dolazi s vrlo specifičnih verzija ili povratNaDestruktivnuMigracijuPriSmanjivanjuGrade()Ovo je korisno kada netko instalira stariju verziju aplikacije preko nove.

Unaprijed pakirane baze podataka

Ponekad želimo da aplikacija dolazi s unaprijed instaliranim podacima. Room vam to omogućuje putem createFromAsset() o createFromFile()Zanimljivo je kako ovo djeluje na destruktivne migracije: ako imate unaprijed zapakiranu datoteku koja odgovara ciljnoj verziji, Room će je koristiti za popunjavanje baze podataka nakon izvođenja destruktivnog čišćenja.

Umjetnost preimenovanja i rukovanja NOT NULL

Preimenovanje stupaca u SQLiteu može biti glavobolja, posebno u verzijama prije API-ja 29. Glavni trik ovdje je obrazac stvori-kopiraj-izbrišiIzrađujete novu tablicu s ispravnim nazivom, prosljeđujete podatke pomoću INSERT INTO ... SELECT i na kraju brišete staru tablicu pomoću DROP TABLE.

Drugi kritičan scenarij je dodavanje stupca NOT NULL bez zadane vrijednosti u tablici koja već sadrži zapise. Budući da SQLite to ne dopušta izravno, morate stvoriti privremenu tablicu s privremenom zadanom vrijednošću, premjestiti podatke, izbrisati original i preimenovati privremenu tablicu u konačnu.

Osiguravanje stabilnosti: Ispitivanje i sheme

Ne pokrećite migraciju u produkciju bez testiranja. Room pruža alat. testiranje u sobi i klasu MigrationTestHelper. Pomoću nje možete stvoriti bazu podataka u staroj verziji, umetnuti stvarne podatke, a zatim pokrenuti runMigrationsAndValidate() kako bi se provjerilo je li konačna shema onakva kakva se očekivala i jesu li podaci još uvijek tu.

Da bi sve ovo bilo održivo, bitno je upravljati JSON datotekama sheme. Konfiguriranje soba.shemaLokacija U Gradle datoteci, Room će generirati povijest verzija. Ove datoteke su apsolutna istina: polje createSql JSON je upravo ono što biste trebali replicirati u svojim ručnim migracijama kako biste izbjegli odstupanja.

Prijelaz s čistog SQLitea na Room

Ako ste s tradicionalnog korištenja SQLitea prešli, prelazak na Room je vrlo koristan. Proces uključuje pretvaranje vaših modela u @EntitetDefinirajte DAO-e koji će zamijeniti vaše ručne upite i stvoriti klasu koja proširuje RoomDatabase. Ključno je povećati verziju baze podataka i definirati put migracije, čak i ako je prazan, kako Room ne bi izbrisao postojeće podatke kada preuzme kontrolu.

Migracije baze podataka s prostorijom
Povezani članak:
Potpuni vodič za stvaranje lokalnih baza podataka s dovoljno prostora na Androidu

Savladavanje životnog ciklusa sheme, od izvoza JSON-a i pisanja preciznog SQL-a do validacije putem instrumentiranih testova, omogućuje aplikaciji da se razvija bez straha od narušavanja korisničkog iskustva ili gubitka vrijednih informacija na uređaju. Podijelite ove informacije kako bi više ljudi moglo saznati o ovoj temi.


Dodaj kao preferirani izvor