A Room egy absztrakciós réteget biztosít az SQLite felett, hogy lehetővé tegye a folyékony adatbázis-hozzáférést, miközben kihasználja az SQLite teljes erejét.
A Roomot ma már jobb megközelítésnek tartják az adatok perzisztenciájához, mint az SQLiteDatabase-t. Megkönnyíti az SQLiteDatabase objektumokkal való munkát az alkalmazásban, csökkenti a boilerplate kód mennyiségét és az SQL-lekérdezések fordítási időben történő ellenőrzését.
- Az SQL-lekérdezések fordítási időben történő ellenőrzése. minden @Query és @Entity a fordítási időben kerül ellenőrzésre, ami megóvja az alkalmazást a futási idejű összeomlási problémáktól, és nem csak az egyetlen szintaxist ellenőrzi, hanem a hiányzó táblákat is.
- Boilerplate kód
- Egyszerűen integrálható más Architecture komponensekkel (például LiveData)
Az SQLite használatával kapcsolatos főbb problémák
- Nincs fordítási idejű ellenőrzése a nyers SQL-lekérdezéseknek. Például, ha olyan SQL-lekérdezést írsz egy rossz oszlopnévvel, amely nem létezik a valós adatbázisban, akkor futási időben kivételt ad, és ezt a problémát nem tudod rögzíteni fordítási időben.
- Amint a séma változik, az érintett SQL-lekérdezéseket manuálisan kell frissítened. Ez a folyamat időigényes és hibakockázatos lehet.
- Sok boilerplate kódot kell használnia az SQL-lekérdezések és a Java adatobjektumok (POJO) közötti konverzióhoz.
Room vs SQLite
A Room egy ORM, Object Relational Mapping könyvtár. Más szóval a Room leképezi az adatbázis-objektumainkat Java objektumokra. A Room egy absztrakciós réteget biztosít az SQLite felett, hogy lehetővé tegye a gördülékeny adatbázis elérést, miközben kihasználja az SQLite teljes erejét.
Különbség az SQLite és a Room perszisztencia könyvtár között:-
- Az SQLite esetében nincs fordítási idejű ellenőrzése a nyers SQLite lekérdezéseknek. A Room esetében viszont van SQL-ellenőrzés fordítási időben.
- Az SQL-lekérdezések és a Java-adatobjektumok közötti konverzióhoz rengeteg boilerplate kódot kell használni. De a Room boilerplate kód nélkül képezi le az adatbázis-objektumainkat Java objektumra.
- Amint a séma változik, az érintett SQL-lekérdezéseket manuálisan kell frissíteni. A Room megoldja ezt a problémát.
- A Room úgy van kialakítva, hogy együttműködjön a LiveData és az RxJava adatmegfigyeléssel, míg az SQLite nem.
A Room DB összetevői
A Room DB-nek három fő összetevője van :
Entity
Egy táblát reprezentál az adatbázisban. A Room minden @Entity
annotációval rendelkező osztályhoz létrehoz egy táblázatot, az osztály mezői megfelelnek a táblázat oszlopainak. Ezért az entitásosztályok általában kis modellosztályok, amelyek nem tartalmaznak logikát.
Entitások annotációi
Mielőtt elkezdenénk az entitások modellezését, meg kell ismernünk néhány hasznos annotációt és azok attribútumait.
@Entity – minden ezzel az annotációval rendelkező modellosztály rendelkezik egy leképező táblával a DB-ben
- foreignKeys – az idegen kulcsok neve
- indices – a táblán található jelek listája
- primaryKeys – az entitások elsődleges kulcsainak neve
- tableName
@PrimaryKey – ahogy a neve is mutatja, ez a megjegyzés az entitás elsődleges kulcsára mutat. autoGenerate – ha igazra van állítva, akkor az SQLite egyedi azonosítót generál az oszlophoz
@PrimaryKey(autoGenerate = true)
@ColumnInfo – lehetővé teszi az oszlopra vonatkozó egyéni információk megadását
@ColumnInfo(name = "column_name")
@Ignore – a mezőt a Room
@Embeded – a beágyazott mezőkre közvetlenül lehet hivatkozni az SQL-kérdésekben.
Dao
ADAO-k felelősek az adatbázist elérő metódusok definiálásáért. Az eredeti SQLite-ban a Cursor
objektumokat használjuk. A Room segítségével nincs szükségünk az összes Cursor
-hoz kapcsolódó kódra, és egyszerűen definiálhatjuk a lekérdezéseinket a Dao
osztályban található megjegyzések segítségével.
Adatbázis
Tartalmazza az adatbázis-tartót, és az alkalmazásunk perzisztens, relációs adataihoz való mögöttes kapcsolat fő hozzáférési pontjaként szolgál.
Az adatbázis létrehozásához egy absztrakt osztályt kell definiálnunk, amely kiterjeszti a RoomDatabase
osztályt. Ez az osztály a @Database
megjegyzéssel van ellátva, felsorolja az adatbázisban található entitásokat és az azokat elérő DAO-kat.
A @Database
megjegyzéssel ellátott osztálynak a következő feltételeknek kell megfelelnie:
- Egy absztrakt osztály legyen, amely kiterjeszti a
RoomDatabase
-et.
- Az annotáción belül tartalmazza az adatbázishoz tartozó entitások listáját.
- Tartalmazzon egy olyan absztrakt metódust, amelynek 0 argumentuma van, és amely a
@Dao
-vel annotált osztályt adja vissza.
Futásidőben a Room.databaseBuilder()
vagy Room.inMemoryDatabaseBuilder()
hívásával szerezhetünk egy Database
példányt.
1. lépés: A Gradle függőségek hozzáadása
- A projekthez való hozzáadáshoz nyissa meg a projektszintű
build.gradle
fájlt, és adja hozzá a kiemelt sort az alábbiak szerint:
2. lépés. Nyissa meg az alkalmazás vagy modul build.gradle
fájlját, és adja hozzá a függőségeket:
A DAO-k felelősek az adatbázishoz hozzáférő módszerek meghatározásáért.
Egy DAO létrehozásához létre kell hoznunk egy interfészt és @Dao megjegyzéssel kell ellátnunk .
Egy adatbázis létrehozásához egy absztrakt osztályt kell definiálnunk, amely kiterjeszti a RoomDatabase
. Ez az osztály a @Database
megjegyzést kapja, felsorolja az adatbázisban található entitásokat és az azokat elérő DAO-kat.
Az adatok kezeléséhez először is létre kell hoznunk az adatbázis egy példányát.
ezután beilleszthetjük a törlést és frissíthetjük az adatbázist.