Komponenter i Room DB
Room har tre hovedkomponenter i Room DB :
- Entity
- Dao
- Database
Entity
Repræsenterer en tabel i databasen. Room opretter en tabel for hver klasse, der har @Entity
annotation, felterne i klassen svarer til kolonnerne i tabellen. Derfor har entitetsklasserne tendens til at være små modelklasser, der ikke indeholder nogen logik.
Entities annotationer
Hvor vi går i gang med at modellere vores entiteter, skal vi kende nogle nyttige annotationer og deres attributter.
@Entity – hver modelklasse med denne annotation vil have en mappingtabel i DB
- foreignKeys – navne på fremmednøgler
- indices – liste over angivelser på tabellen
- primaryKeys – navne på entitetens primære nøgler
- tableName
@PrimaryKey – som navnet antyder, denne annotation peger på enhedens primære nøgle. autoGenerate – hvis den er sat til true, genererer SQLite et unikt id for kolonnen
@PrimaryKey(autoGenerate = true)
@ColumnInfo – giver mulighed for at angive brugerdefinerede oplysninger om kolonnen
@ColumnInfo(name = "column_name")
@Ignore – feltet vil ikke blive persisteret af Room
@Embeded – indlejrede felter kan refereres direkte i SQL-forespørgsler.
Dao
DAO’er er ansvarlige for at definere de metoder, der har adgang til databasen. I den oprindelige SQLite bruger vi Cursor
-objekterne. Med Room har vi ikke brug for al den Cursor
-relaterede kode og kan blot definere vores forespørgsler ved hjælp af annotationer i Dao
-klassen.
Database
Indeholder databaseholderen og tjener som hovedadgangspunkt for den underliggende forbindelse til din app’s persisterede, relationelle data.
For at oprette en database skal vi definere en abstrakt klasse, der udvider RoomDatabase
. Denne klasse annoteres med @Database
og indeholder en liste over de enheder, der er indeholdt i databasen, og de DAO’er, der har adgang til dem.
Klassen, der annoteres med @Database
, skal opfylde følgende betingelser:
- Det skal være en abstrakt klasse, der udvider
RoomDatabase
. - Inkluderer listen over enheder, der er tilknyttet databasen, i annotationen.
- Indeholder en abstrakt metode, der har 0 argumenter og returnerer den klasse, der er annoteret med
@Dao
.
På køretid kan du erhverve en instans af Database
ved at kalde Room.databaseBuilder()
ellerRoom.inMemoryDatabaseBuilder()
.
Trin 1: Tilføj Gradle-afhængigheder
- For at tilføje det til dit projekt skal du åbne filen
build.gradle
på projektniveau og tilføje den fremhævede linje som vist nedenfor:
2. Åbn build.gradle
-filen for din app eller dit modul, og tilføj afhængigheder:
Stræk 2: Opret en modelklasse
Room opretter en tabel for hver klasse annoteret med @Entity
; felterne i klassen svarer til kolonnerne i tabellen. Derfor har entitetsklasserne tendens til at være små modelklasser, der ikke indeholder nogen logik. Vores Person
-klasse repræsenterer modellen for dataene i databasen. Så lad os opdatere den for at fortælle Room, at den skal oprette en tabel baseret på denne klasse:
- Annoter klassen med
@Entity
og brugtableName
-egenskaben til at angive navnet på tabellen. - Sæt primærnøglen ved at tilføje
@PrimaryKey
-annotationen til de korrekte felter – i vores tilfælde er det brugerens ID. - Sæt navnet på kolonnerne for klassens felter ved hjælp af
@ColumnInfo(name = "column_name")
-annotationen. Du er velkommen til at springe dette trin over, hvis dine felter allerede har det korrekte kolonnenavn. - Hvis flere konstruktører er egnede, skal du tilføje annotationen
@Ignore
for at fortælle Room, hvilke der skal bruges og hvilke der ikke skal bruges.
Stræk 3: Opret Data Access Objects (DAO’er)
DAO’er er ansvarlige for at definere de metoder, der har adgang til databasen.
For at oprette en DAO skal vi oprette en grænseflade og annoteret med @Dao .
Stræk 4 – Opret databasen
For at oprette en database skal vi definere en abstrakt klasse, der udvider RoomDatabase
. Denne klasse er annoteret med @Database
, og den indeholder en liste over de enheder, der er indeholdt i databasen, og de DAO’er, der har adgang til dem.
Stræk 4: Håndtering af data
For at kunne håndtere dataene skal vi først og fremmest oprette en instans af databasen.
Dernæst kan vi indsætte slette og opdatere databasen.
Sørg for, at alle operationen skal udføres på en anden tråd. I mit tilfælde bruger jeg Executers (se her)
Query:
Insert:
Slet:
opdatering:
Udfører med Executer
Jeg har også linket en repo, hvis du har brug for at se et eksempel på Room Database.