Pentru aceia dintre voi care nu știu ce este Android Jetpack, atunci
Android Jetpack este o colecție de componente software Android pentru a vă facilita dezvoltarea unor aplicații Android excelente.
Ele vă vor ajuta să
- Să urmați cele mai bune practici
- Să vă eliberați de scrierea de cod boilerplate.
- Simplificați sarcinile complexe, astfel încât să vă puteți concentra pe codul care vă interesează.
Iată videoclipul de pe Android Developers Channel:
Acum să vorbim despre Room
Room este o bibliotecă de persistență, parte a Android Jetpack.
Iată videoclipul de pe Android Developers Channel:
Room oferă un strat de abstractizare peste SQLite pentru a permite un acces fluent la baza de date, în timp ce exploatează întreaga putere a SQLite.
Room este considerat acum ca o abordare mai bună pentru persistența datelor decât SQLiteDatabase. Facilitează lucrul cu obiectele SQLiteDatabase în aplicația dvs., scăzând cantitatea de cod boilerplate și verificând interogările SQL la compilare.
- Verificarea la compilare a interogărilor SQL. fiecare @Query și @Entity este verificată la compilare, ceea ce protejează aplicația dvs. de probleme de blocare în timpul execuției și nu verifică doar sintaxa, ci și tabelele lipsă.
- Codul boilerplate
- Se integrează ușor cu alte componente Architecture (cum ar fi LiveData)
Problemele majore cu utilizarea SQLite sunt
- Nu există o verificare la compilare a interogărilor SQL brute. De exemplu, dacă scrieți o interogare SQL cu un nume de coloană greșit care nu există în baza de date reală, atunci aceasta va da o excepție în timpul execuției și nu puteți capta această problemă în timpul compilării.
- Pe măsură ce schema dvs. se schimbă, trebuie să actualizați manual interogările SQL afectate. Acest proces poate fi consumator de timp și predispus la erori.
- Trebuie să utilizați o mulțime de cod boilerplate pentru a converti între interogările SQL și obiectele de date Java (POJO).
Room vs SQLite
Room este o bibliotecă ORM, Object Relational Mapping. Cu alte cuvinte, Room va cartografia obiectele bazei noastre de date în obiecte Java. Room oferă un strat de abstractizare peste SQLite pentru a permite un acces fluent la baza de date în timp ce exploatează întreaga putere a SQLite.
Diferența dintre SQLite și biblioteca de persistență Room:-
- În cazul SQLite, nu există o verificare la compilare a interogărilor SQLite brute. Dar în Room, există validare SQL la compilare.
- Trebuie să folosiți o mulțime de cod boilerplate pentru a converti între interogările SQL și obiectele de date Java. Dar, Room mapează obiectele bazei noastre de date în obiecte Java Object fără cod boilerplate.
- Pe măsură ce schema dumneavoastră se schimbă, trebuie să actualizați manual interogările SQL afectate. Room rezolvă această problemă.
- Room este construit pentru a funcționa cu LiveData și RxJava pentru observarea datelor, în timp ce SQLite nu o face.
Componente ale Room DB
Room are trei componente principale ale Room DB :
- Entity
- Dao
- Bază de date
Entity
Reprezintă o tabelă în cadrul bazei de date. Camera creează o tabelă pentru fiecare clasă care are @Entity
anunțare, câmpurile din clasă corespund coloanelor din tabelă. Prin urmare, clasele de entități tind să fie clase model mici care nu conțin nici o logică.
Anotații de entități
Înainte de a începe modelarea entităților noastre, trebuie să cunoaștem câteva adnotări utile și atributele lor.
@Entity – fiecare clasă model cu această adnotare va avea o tabelă de corespondență în BD
- foreignKeys – numele cheilor străine
- indices – lista de indicații de pe tabel
- primaryKeys – numele cheilor primare ale entității
- tableName
@PrimaryKey – așa cum indică și numele său, această adnotare indică cheia primară a entității. autoGenerate – dacă este setat la true, atunci SQLite va genera un id unic pentru coloană
@PrimaryKey(autoGenerate = true)
@ColumnInfo – permite specificarea de informații personalizate despre coloană
@ColumnInfo(name = "column_name")
@Ignore – câmpul nu va fi persistat de Room
@Embeded – câmpurile imbricate pot fi menționate direct în interogările SQL.
Dao
DAO-urile sunt responsabile pentru definirea metodelor care accesează baza de date. În SQLite-ul inițial, folosim obiectele Cursor
. Cu Room, nu avem nevoie de tot codul legat de Cursor
și putem pur și simplu să ne definim interogările folosind adnotări în clasa Dao
.
Bază de date
Conține suportul bazei de date și servește ca principal punct de acces pentru conexiunea subiacentă la datele persistate, relaționale ale aplicației dvs. Această clasă este adnotată cu @Database
, enumeră entitățile conținute în baza de date și DAO-urile care le accesează.
Clasa care este adnotată cu @Database
trebuie să îndeplinească următoarele condiții:
- Să fie o clasă abstractă care extinde
RoomDatabase
. - Includeți lista entităților asociate cu baza de date în cadrul adnotării.
- Conține o metodă abstractă care are 0 argumente și returnează clasa care este adnotată cu
@Dao
.
În timpul execuției, puteți obține o instanță a Database
prin apelarea Room.databaseBuilder()
sauRoom.inMemoryDatabaseBuilder()
.
Pasul 1: Adăugați dependențele Gradle
- Pentru a le adăuga în proiect, deschideți fișierul de nivel de proiect
build.gradle
și adăugați linia evidențiată, așa cum se arată mai jos:
2. Deschideți fișierul build.gradle
pentru aplicația sau modulul dvs. și adăugați dependențele:
Etapa 2: Creați o clasă model
Room creează un tabel pentru fiecare clasă adnotată cu @Entity
; câmpurile din clasă corespund coloanelor din tabel. Prin urmare, clasele de entități tind să fie clase model mici care nu conțin nicio logică. Clasa noastră Person
reprezintă modelul pentru datele din baza de date. Așa că haideți să o actualizăm pentru a-i spune lui Room că ar trebui să creeze un tabel bazat pe această clasă:
- Anotați clasa cu
@Entity
și folosiți proprietateatableName
pentru a seta numele tabelului. - Setați cheia primară adăugând adnotarea
@PrimaryKey
la câmpurile corecte – în cazul nostru, acesta este ID-ul utilizatorului. - Setați numele coloanelor pentru câmpurile clasei folosind adnotarea
@ColumnInfo(name = "column_name")
. Nu ezitați să săriți peste acest pas dacă câmpurile dvs. au deja numele corect al coloanelor. - Dacă mai mulți constructori sunt potriviți, adăugați adnotarea
@Ignore
pentru a spune Room care ar trebui să fie folosit și care nu.
Etapa 3: Crearea obiectelor de acces la date (Data Access Objects – DAOs)
DAOs sunt responsabile pentru definirea metodelor care accesează baza de date.
Pentru a crea un DAO trebuie să creăm o interfață și să o notăm cu @Dao .
Etapa 4 – Crearea bazei de date
Pentru a crea o bază de date trebuie să definim o clasă abstractă care extinde RoomDatabase
. Această clasă este adnotată cu @Database
, listează entitățile conținute în baza de date și DAO-urile care le accesează.
Etapa 4: Gestionarea datelor
Pentru a gestiona datele, mai întâi de toate, trebuie să creăm o instanță a bazei de date.
după care putem insera șterge și actualiza baza de date.
Asigurați-vă că toate operațiunile trebuie să se execute pe un fir de execuție diferit. În cazul meu folosesc Executers (vezi aici)
Query:
Insert:
Delete:
Update:
Update:
Executare cu Executer
Am legat și un repo dacă aveți nevoie să vedeți exemplul de Room Database.