Pro ty z vás, kteří nevědí, co je to Android Jetpack, pak
Android Jetpack je kolekce softwarových komponent pro Android, která vám usnadní vývoj skvělých aplikací pro Android.
Pomohou vám
- Dodržovat osvědčené postupy
- Osvobodí vás od psaní šablonového kódu.
- Zjednoduší složité úlohy, takže se můžete soustředit na kód, na kterém vám záleží.
Tady je video z kanálu Android Developers:
Nyní si povíme o knihovně Room
Room je knihovna pro perzistenci, součást balíčku Android Jetpack.
Tady je video z kanálu Android Developers Channel:
Room poskytuje abstrakční vrstvu nad SQLite, která umožňuje plynulý přístup k databázi a zároveň využívá plný výkon SQLite.
Room je nyní považován za lepší přístup k perzistenci dat než SQLiteDatabase. Usnadňuje práci s objekty SQLiteDatabase ve vaší aplikaci, snižuje množství kotelního kódu a ověřuje dotazy SQL v době kompilace.
- Ověřování dotazů SQL v době kompilace. každý @Query a @Entity je kontrolován v době kompilace, což chrání vaši aplikaci před problémy s pádem za běhu a nejenže kontroluje pouze syntaxi, ale také chybějící tabulky.
- Kód šablony
- Snadná integrace s dalšími komponentami architektury (jako LiveData)
Hlavní problémy s použitím SQLite jsou
- Neexistuje žádné ověřování surových dotazů SQL při kompilaci. Například pokud napíšete SQL dotaz se špatným názvem sloupce, který v reálné databázi neexistuje, pak se při běhu zobrazí výjimka a tento problém nelze zachytit při kompilaci.
- Při změně schématu musíte dotčené SQL dotazy aktualizovat ručně. Tento proces může být časově náročný a náchylný k chybám.
- K převodu mezi dotazy SQL a datovými objekty v jazyce Java (POJO) musíte použít spoustu šablonového kódu.
Room vs SQLite
Room je knihovna ORM, Object Relational Mapping. Jinými slovy, Room bude mapovat naše databázové objekty na objekty Javy. Room poskytuje abstrakční vrstvu nad SQLite, která umožňuje plynulý přístup k databázi a zároveň využívá plný výkon SQLite.
Rozdíl mezi SQLite a knihovnou pro perzistenci Room:-
- V případě SQLite nedochází k ověření surových dotazů SQLite při kompilaci. V případě knihovny Room však existuje ověřování SQL v době kompilace.
- K převodu mezi dotazy SQL a datovými objekty v jazyce Java je třeba použít spoustu kódu boilerplate. Ale Room mapuje naše databázové objekty na objekty Javy bez kotlíkového kódu.
- Při změně schématu musíte dotčené dotazy SQL aktualizovat ručně. Room tento problém řeší.
- Room je vytvořen pro spolupráci s LiveData a RxJava pro pozorování dat, zatímco SQLite nikoli.
Komponenty Room DB
Room má tři hlavní komponenty Room DB :
- Entita
- Dao
- Databáze
Entita
Představuje tabulku v rámci databáze. Room vytvoří tabulku pro každou třídu, která má @Entity
anotaci, pole ve třídě odpovídají sloupcům v tabulce. Proto bývají třídy entit malými modelovými třídami, které neobsahují žádnou logiku.
Anotace entit
Než začneme modelovat naše entity, musíme znát některé užitečné anotace a jejich atributy.
@Entity – každá modelová třída s touto anotací bude mít v DB mapovací tabulku
- foreignKeys – názvy cizích klíčů
- indices – seznam indicií v tabulce
- primaryKeys – názvy primárních klíčů entit
- tableName
@PrimaryKey – jak napovídá její název, tato anotace označuje primární klíč entity. autoGenerate – pokud je nastaveno na true, pak SQLite bude generovat jedinečné id pro sloupec
@PrimaryKey(autoGenerate = true)
@ColumnInfo – umožňuje zadat vlastní informace o sloupci
@ColumnInfo(name = "column_name")
@Ignore – pole nebude perzistovat u Room
@Embeded – na vnořená pole lze odkazovat přímo v SQL dotazech.
Dao
DAO jsou zodpovědné za definování metod, které přistupují k databázi. V původním SQLite používáme objekty Cursor
. Díky Roomu nepotřebujeme veškerý kód související s Cursor
a můžeme jednoduše definovat naše dotazy pomocí anotací ve třídě Dao
.
Databáze
Obsahuje držitele databáze a slouží jako hlavní přístupový bod pro základní připojení k perzistovaným, relačním datům vaší aplikace.
Pro vytvoření databáze musíme definovat abstraktní třídu, která rozšiřuje RoomDatabase
. Tato třída je anotována @Database
, obsahuje seznam entit obsažených v databázi a DAO, které k nim přistupují.
Třída, která je anotována @Database
, by měla splňovat následující podmínky:
- Být abstraktní třídou, která rozšiřuje
RoomDatabase
. - V rámci anotace obsahovat seznam entit spojených s databází.
- Obsahovat abstraktní metodu, která má 0 argumentů a vrací třídu, která je anotována pomocí
@Dao
.
V době běhu můžete získat instanci třídy Database
voláním Room.databaseBuilder()
neboRoom.inMemoryDatabaseBuilder()
.
Krok 1: Přidání závislostí Gradle
- Pro přidání do projektu otevřete soubor
build.gradle
na úrovni projektu a přidejte zvýrazněný řádek, jak je uvedeno níže: