Room tarjoaa SQLiten yläpuolelle abstraktiokerroksen, joka mahdollistaa sujuvan tietokantakäytön samalla kun se hyödyntää SQLiten koko tehon.
Roomia pidetään nykyään parempana lähestymistapana tietojen pysyvyydelle kuin SQLiteDatabasea. Se helpottaa SQLiteDatabase-objektien kanssa työskentelyä sovelluksessasi, vähentää boilerplate-koodin määrää ja tarkistaa SQL-kyselyt kääntämisaikana.
- SQL-kyselyjen tarkistaminen kääntämisaikana. jokainen @Query ja @Entity tarkistetaan kääntämisaikana, mikä säilyttää sovelluksesi kaatumisongelmilta ajonaikana, eikä se tarkista vain pelkkää syntaksia vaan myös puuttuvat taulukot.
- Boilerplate-koodi
- Helppo integroitavissa muihin Architecture-komponentteihin (kuten LiveData)
Suurimmat SQLite-käytön ongelmat ovat
- Raaka-SQL-kyselyjen kääntämisaikaista tarkistusta ei ole. Jos esimerkiksi kirjoitat SQL-kyselyn, jossa on väärä sarakkeen nimi, jota ei ole olemassa todellisessa tietokannassa, se antaa poikkeuksen suoritusaikana, eikä tätä ongelmaa voi havaita kääntämisen aikana.
- Kun skeema muuttuu, sinun on päivitettävä kyseiset SQL-kyselyt manuaalisesti. Tämä prosessi voi olla aikaa vievä ja virhealtis.
- Sinun täytyy käyttää paljon boilerplate-koodia SQL-kyselyjen ja Java-tieto-objektien (POJO) väliseen muuntamiseen.
Room vs SQLite
Room on ORM, Object Relational Mapping -kirjasto. Toisin sanoen Room kartoittaa tietokantaobjektejamme Java-objekteiksi. Room tarjoaa SQLiten päälle abstraktiokerroksen, joka mahdollistaa sujuvan tietokantakäytön samalla kun se hyödyntää SQLiten koko tehon.
Ero SQLiten ja Room persistenssikirjaston välillä:-
- SQLiten tapauksessa SQLiten raakojen SQLite-kyselyjen käännösaikaista tarkistusta ei ole. Mutta Roomissa on SQL-validointi kääntämisaikana.
- Tarvitaan paljon boilerplate-koodia SQL-kyselyjen ja Java-tieto-objektien väliseen muuntamiseen. Mutta Room kartoittaa tietokantaobjektejamme Java-objekteiksi ilman boilerplate-koodia.
- Kun skeema muuttuu, sinun on päivitettävä kyseiset SQL-kyselyt manuaalisesti. Room ratkaisee tämän ongelman.
- Room on rakennettu toimimaan LiveDatan ja RxJavan kanssa tietojen havainnointia varten, kun taas SQLite ei.
Room DB:n komponentit
Roomissa on kolme pääkomponenttia Room DB :
Entity
Kuvastaa taulua tietokannassa. Room luo taulukon jokaiselle luokalle, jolla on @Entity
merkintä, luokan kentät vastaavat taulukon sarakkeita. Siksi entiteettiluokat ovat yleensä pieniä malliluokkia, jotka eivät sisällä mitään logiikkaa.
Entiteettien annotaatiot
Ennen kuin aloitamme entiteettiemme mallintamisen, meidän on tunnettava muutamia hyödyllisiä annotaatioita ja niiden attribuutteja.
@Entity – jokaisella malliluokalla, jossa on tämä annotaatio, on DB:ssä kartoitustaulu
- foreignKeys – vierasavainten nimet
- indeksit – luettelo taulun merkinnöistä
- primaryKeys – entiteettien ensiöavainten nimet
- taulukkonimi
@PrimaryKey – nimensä mukaisesti, tämä merkintä osoittaa olion ensisijaisen avaimen. autoGenerate – jos arvoksi asetetaan true, SQLite luo sarakkeelle yksilöllisen tunnuksen
@PrimaryKey(autoGenerate = true)
@ColumnInfo – mahdollistaa mukautettujen tietojen antamisen sarakkeesta
@ColumnInfo(name = "column_name")
@Ignore – kenttää ei säilytetä huoneessa
@Embededed – sisäkkäisiin kenttiin voidaan viitata suoraan SQL-kyselyissä.
Dao
DAO:t ovat vastuussa tietokantaan pääsevien metodien määrittelystä. Alkuperäisessä SQLitessä käytetään Cursor
-objekteja. Roomissa emme tarvitse kaikkea Cursor
:iin liittyvää koodia, vaan voimme yksinkertaisesti määritellä kyselyt käyttäen annotaatioita Dao
-luokassa.
Database
Sisältää tietokannan haltijan ja toimii pääasiallisena käyttöpisteenä sovelluksen taustalla olevalle yhteydelle persistoituneeseen, relationaaliseen dataan.
Tietokannan luomiseksi meidän on määriteltävä abstrakti luokka, joka laajentaa luokkaa RoomDatabase
. Tämä luokka on annotoitu @Database
:lla, siinä luetellaan tietokannan sisältämät oliot ja DAO:t, jotka käyttävät niitä.
Luokan, joka on annotoitu @Database
:lla, tulisi täyttää seuraavat ehdot:
- Ole abstrakti luokka, joka laajentaa
RoomDatabase
.
- Sisältää annotaatioon sisältyvän luettelon tietokantaan liittyvistä olioista.
- Sisältää abstraktin metodin, jolla on 0 argumenttia ja joka palauttaa luokan, joka on annotoitu
@Dao
:llä.
Ajoaikana voit hankkia Database
:n instanssin kutsumalla Room.databaseBuilder()
:tä tai Room.inMemoryDatabaseBuilder()
. Avaa sovelluksesi tai moduulisi build.gradle
-tiedosto ja lisää riippuvuudet: