Användning av rumsdatabas | Android Jetpack

Ashish Rawat

Följ

23 februari, 2019 – 6 min read

För dig som inte vet vad Android Jetpack är

Android Jetpack är en samling Android-programvarukomponenter som gör det enklare för dig att utveckla bra Android-appar.
De hjälper dig att

  • Följa bästa praxis
  • Förhindra dig från att skriva boilerplate-kod.
  • Förenkla komplexa uppgifter, så att du kan fokusera på den kod du bryr dig om.

Här är videon från Android Developers Channel:

Nu ska vi prata om Room

Room är ett persistensbibliotek som ingår i Android Jetpack.

Här är videon från Android Developers Channel:

Room tillhandahåller ett abstraktionslager över SQLite för att möjliggöra flytande databasåtkomst samtidigt som man utnyttjar den fulla kraften i SQLite.

Room anses nu vara ett bättre tillvägagångssätt för datapersistens än SQLiteDatabase. Det gör det enklare att arbeta med SQLiteDatabasobjekt i din app, vilket minskar mängden boilerplate-kod och verifierar SQL-frågor vid kompileringstid.

  • Kompileringstidsverifiering av SQL-frågor. varje @Query och @Entity kontrolleras vid kompileringstid, vilket bevarar din app från kraschproblem vid körning och det är inte bara den enda syntaxen som kontrolleras, utan även saknade tabeller.
  • Boilerplate-kod
  • Lätt att integrera med andra Architecture-komponenter (som LiveData)

De största problemen med SQLite-användning är

  • Det finns ingen kompileringskontroll av råa SQL-förfrågningar. Om du till exempel skriver en SQL-fråga med ett felaktigt kolumnnamn som inte finns i den riktiga databasen kommer den att ge ett undantag under körtiden och du kan inte fånga problemet under kompileringstiden.
  • När ditt schema ändras måste du uppdatera de berörda SQL-frågorna manuellt. Denna process kan vara tidskrävande och felbenägen.
  • Du måste använda massor av boilerplate-kod för att konvertera mellan SQL-frågor och Java-dataobjekt (POJO).

Room vs SQLite

Room är ett ORM-bibliotek, Object Relational Mapping. Med andra ord mappar Room våra databasobjekt till Java-objekt. Room tillhandahåller ett abstraktionslager över SQLite för att möjliggöra flytande databasåtkomst samtidigt som SQLite utnyttjas fullt ut.

Skillnaden mellan SQLite och Room persistensbibliotek:-

  • I fallet med SQLite finns det ingen verifiering vid kompilering av råa SQLite-frågor. Men i Room finns det SQL-validering vid kompileringstid.
  • Du måste använda massor av boilerplate-kod för att konvertera mellan SQL-förfrågningar och Java-dataobjekt. Men Room mappar våra databasobjekt till Java-objekt utan koder.
  • När ditt schema ändras måste du uppdatera de berörda SQL-frågorna manuellt. Room löser detta problem.
  • Room är byggt för att fungera med LiveData och RxJava för dataobservation, medan SQLite inte gör det.
Room är fantastisk

Komponenter i Room DB

Room har tre huvudkomponenter i Room DB :

  • Entity
  • Dao
  • Databas

Entity

Representerar en tabell i databasen. Room skapar en tabell för varje klass som har @Entity annotation, fälten i klassen motsvarar kolumner i tabellen. Därför tenderar entitetsklasserna att vara små modellklasser som inte innehåller någon logik.

Entities annotationer

För att komma igång med modelleringen av våra entiteter måste vi känna till några användbara annotationer och deras attribut.

@Entity – varje modellklass med denna annotation kommer att ha en mappningstabell i DB

  • foreignKeys – namn på utländska nycklar
  • indices – lista över indikationer på tabellen
  • primaryKeys – namn på entitetens primära nycklar
  • tableName

@PrimaryKey – som namnet anger, Denna anteckning pekar på enhetens primära nyckel. autoGenerate – om den är inställd på true kommer SQLite att generera ett unikt id för kolumnen

@PrimaryKey(autoGenerate = true)

@ColumnInfo – gör det möjligt att ange anpassad information om kolumnen

@ColumnInfo(name = "column_name")

@Ignore – fältet kommer inte att bevaras av Room

@Embeded – inbäddade fält kan refereras direkt i SQL-frågorna.

Dao

DAO:er ansvarar för att definiera de metoder som ger tillgång till databasen. I den ursprungliga SQLite använder vi Cursor-objekten. Med Room behöver vi inte all Cursor-relaterad kod och kan helt enkelt definiera våra frågor med hjälp av annotationer i Dao-klassen.

Databas

Innehåller databashållaren och tjänar som huvudåtkomstpunkt för den underliggande anslutningen till din apps persisterade, relationella data.

För att skapa en databas måste vi definiera en abstrakt klass som förlänger RoomDatabase. Denna klass är annoterad med @Database, listar de enheter som finns i databasen och de DAO:er som har åtkomst till dem.

Klassen som är annoterad med @Database bör uppfylla följande villkor:

  • Vara en abstrakt klass som förlänger RoomDatabase.
  • Inkludera listan över enheter som är associerade med databasen i annotationen.
  • Innehåller en abstrakt metod som har 0 argument och returnerar klassen som är annoterad med @Dao.

Vid körning kan du förvärva en instans av Database genom att anropa Room.databaseBuilder() ellerRoom.inMemoryDatabaseBuilder().

Steg 1: Lägg till Gradle-beroenden

  1. För att lägga till det i ditt projekt öppnar du filen build.gradle på projektnivå och lägger till den markerade raden enligt nedan:

2. Öppna build.gradle-filen för din app eller modul och lägg till beroenden:

Steg 2: Skapa en modellklass

Room skapar en tabell för varje klass som annoterats med @Entity; fälten i klassen motsvarar kolumner i tabellen. Därför tenderar entitetsklasserna att vara små modellklasser som inte innehåller någon logik. Vår Person-klass representerar modellen för data i databasen. Så låt oss uppdatera den så att den talar om för Room att den ska skapa en tabell baserad på den här klassen:

  • Anteckna klassen med @Entity och använd egenskapen tableName för att ställa in namnet på tabellen.
  • Sätt primärnyckeln genom att lägga till @PrimaryKey-annotationen till de rätta fälten – i vårt fall är det användarens ID.
  • Ställ in namnet på kolumnerna för klassens fält med hjälp av @ColumnInfo(name = "column_name")-annotationen. Hoppa gärna över det här steget om dina fält redan har rätt kolumnnamn.
  • Om flera konstruktörer är lämpliga lägger du till @Ignore-annotationen för att tala om för Room vilka som ska användas och vilka som inte ska användas.

Steg 3: Skapa dataåtkomstobjekt (DAO:s)

DaO:s ansvarar för att definiera metoderna som ger tillgång till databasen.

För att skapa ett DAO måste vi skapa ett gränssnitt och annoterat med @Dao .

Steg 4 – Skapa databasen

För att skapa en databas måste vi definiera en abstrakt klass som utökar RoomDatabase. Denna klass är annoterad med @Database, listar de enheter som finns i databasen och de DAO:er som har tillgång till dem.

Steg 4: Hantera data

För att kunna hantera data måste vi först av allt skapa en instans av databasen.

Därefter kan vi infoga radera och uppdatera databasen.

Säkerställ att alla operationer ska utföras på en annan tråd. I mitt fall använder jag Executers (se här)

Query:

Insert:

Släpp:

Uppdatera:

Exekvering med Executer

Jag har också länkat en repo om du vill se ett exempel på Room Database.

Lämna en kommentar