Using Room Database | Android Jetpack

Ashish Rawat

Follow

Luty 23, 2019 – 6 min read

.

Dla tych z was, którzy nie wiedzą co to jest Android Jetpack to

Android Jetpack jest zbiorem komponentów oprogramowania Android, aby ułatwić Ci tworzenie wspaniałych aplikacji Android.
Pomogą Ci one

  • Podążać za najlepszymi praktykami
  • Uwolnić Cię od pisania kodu typu boilerplate.
  • Uprościć złożone zadania, dzięki czemu możesz skupić się na kodzie, na którym Ci zależy.

Tutaj jest wideo z Android Developers Channel:

Teraz porozmawiajmy o Room

Room jest biblioteką persystencji, częścią Android Jetpack.

Tutaj wideo z Android Developers Channel:

Room zapewnia warstwę abstrakcji nad SQLite, aby umożliwić płynny dostęp do bazy danych, jednocześnie wykorzystując pełną moc SQLite.

Room jest obecnie uważany za lepsze podejście do trwałości danych niż SQLiteDatabase. Ułatwia to pracę z obiektami SQLiteDatabase w twojej aplikacji, zmniejszając ilość kodu szablonowego i weryfikując zapytania SQL w czasie kompilacji.

  • Weryfikacja zapytań SQL w czasie kompilacji. każde @Query i @Entity jest sprawdzane w czasie kompilacji, co chroni twoją aplikację przed problemami z awarią w czasie działania i nie tylko sprawdza jedyną składnię, ale także brakujące tabele.
  • Boilerplate code
  • Łatwa integracja z innymi komponentami Architektury (jak LiveData)

Główne problemy z użyciem SQLite to

  • Nie ma weryfikacji w czasie kompilacji surowych zapytań SQL. Na przykład, jeśli napiszesz zapytanie SQL z niepoprawną nazwą kolumny, która nie istnieje w prawdziwej bazie danych, spowoduje to wyjątek w czasie wykonywania i nie można uchwycić tego problemu w czasie kompilacji.
  • Jak twój schemat się zmienia, musisz ręcznie aktualizować zapytania SQL, których to dotyczy. Proces ten może być czasochłonny i podatny na błędy.
  • Musisz używać wielu szablonów kodu do konwersji pomiędzy zapytaniami SQL i obiektami danych Java (POJO).

Room vs SQLite

Room jest biblioteką ORM, Object Relational Mapping. Innymi słowy, Room będzie mapował nasze obiekty bazodanowe na obiekty Java. Room dostarcza warstwę abstrakcji nad SQLite, aby umożliwić płynny dostęp do bazy danych, jednocześnie wykorzystując pełną moc SQLite.

Różnica pomiędzy SQLite a biblioteką persystencji Room:-

  • W przypadku SQLite, nie ma weryfikacji w czasie kompilacji surowych zapytań SQLite. Ale w Room, istnieje walidacja SQL w czasie kompilacji.
  • Musisz użyć wielu szablonów kodu do konwersji między zapytaniami SQL i obiektami danych Java. Jednak Room mapuje nasze obiekty bazodanowe do obiektów Java bez użycia kodu boilerplate.
  • Jak twój schemat się zmienia, musisz ręcznie aktualizować zapytania SQL. Room rozwiązuje ten problem.
  • Room jest zbudowany do pracy z LiveData i RxJava do obserwacji danych, podczas gdy SQLite nie.
Room jest niesamowity

Komponenty Room DB

Room ma trzy główne komponenty Room DB :

  • Entity
  • Dao
  • Database

Entity

Reprezentuje tabelę wewnątrz bazy danych. Pokój tworzy tabelę dla każdej klasy, która ma @Entity anotację, pola w klasie odpowiadają kolumnom w tabeli. Dlatego klasy encji mają tendencję do bycia małymi klasami modelowymi, które nie zawierają żadnej logiki.

Anotacje encji

Zanim zaczniemy modelować nasze encje, musimy poznać kilka przydatnych adnotacji i ich atrybutów.

@Entity – każda klasa modelu z tą adnotacją będzie posiadała tabelę mapującą w DB

  • foreignKeys – nazwy kluczy obcych
  • indices – lista wskazań na tabelę
  • primaryKeys – nazwy kluczy głównych encji
  • tableName

@PrimaryKey – jak sama nazwa wskazuje, ta adnotacja wskazuje na klucz główny encji. autoGenerate – jeśli ustawione na true, wtedy SQLite będzie generował unikalne id dla kolumny

@PrimaryKey(autoGenerate = true)

@ColumnInfo – pozwala na określenie własnych informacji o kolumnie

@ColumnInfo(name = "column_name")

@Ignore – pole nie będzie przechowywane przez Room

@Embeded – zagnieżdżone pola mogą być przywoływane bezpośrednio w zapytaniach SQL.

Dao

DAO są odpowiedzialne za definiowanie metod, które mają dostęp do bazy danych. W początkowym SQLite korzystamy z obiektów Cursor. W przypadku Room nie potrzebujemy całego kodu związanego z Cursor i możemy po prostu zdefiniować nasze zapytania, używając adnotacji w klasie Dao.

Database

Zawiera uchwyt bazy danych i służy jako główny punkt dostępu do bazowego połączenia z persystentnymi, relacyjnymi danymi twojej aplikacji.

Aby stworzyć bazę danych, musimy zdefiniować klasę abstrakcyjną, która rozszerza RoomDatabase. Klasa ta jest opatrzona adnotacją @Database, wymienia encje zawarte w bazie danych oraz DAO, które uzyskują do nich dostęp.

Klasa opatrzona adnotacją @Database powinna spełniać następujące warunki:

  • Być klasą abstrakcyjną, która rozszerza RoomDatabase.
  • Zawierać listę encji związanych z bazą danych wewnątrz adnotacji.
  • Zawierać metodę abstrakcyjną, która ma 0 argumentów i zwraca klasę, która jest opatrzona adnotacją @Dao.

W czasie wykonywania można pozyskać instancję Database przez wywołanie Room.databaseBuilder() lubRoom.inMemoryDatabaseBuilder().

Krok 1: Dodaj zależności Gradle

  1. Aby dodać je do projektu, otwórz plik build.gradle na poziomie projektu i dodaj wyróżnioną linię, jak pokazano poniżej:

2. Otwórz plik build.gradle dla swojej aplikacji lub modułu i dodaj zależności:

Krok 2: Utwórz klasę modelu

Room tworzy tabelę dla każdej klasy opatrzonej adnotacją @Entity; pola w klasie odpowiadają kolumnom w tabeli. Dlatego klasy encji są zwykle małymi klasami modelowymi, które nie zawierają żadnej logiki. Nasza klasa Person reprezentuje model dla danych w bazie danych. Zaktualizujmy ją więc, aby powiedzieć Roomowi, że powinien utworzyć tabelę opartą na tej klasie:

  • Dodaj do klasy adnotację @Entity i użyj właściwości tableName, aby ustawić nazwę tabeli.
  • Ustaw klucz główny, dodając adnotację @PrimaryKey do odpowiednich pól – w naszym przypadku jest to ID użytkownika.
  • Ustaw nazwy kolumn dla pól klasy, używając adnotacji @ColumnInfo(name = "column_name"). Nie krępuj się pominąć tego kroku, jeśli twoje pola mają już poprawną nazwę kolumny.
  • Jeśli wiele konstruktorów jest odpowiednich, dodaj adnotację @Ignore, aby powiedzieć Roomowi, które powinny być używane, a które nie.

Krok 3: Tworzenie obiektów dostępu do danych (DAO)

DAO są odpowiedzialne za definiowanie metod, które uzyskują dostęp do bazy danych.

Aby stworzyć DAO musimy stworzyć interfejs i opatrzyć go adnotacją @Dao .

Krok 4 – Tworzenie bazy danych

Aby stworzyć bazę danych musimy zdefiniować klasę abstrakcyjną, która rozszerza RoomDatabase. Klasa ta posiada adnotację @Database, wymienia encje zawarte w bazie danych oraz DAO, które uzyskują do nich dostęp.

Krok 4: Zarządzanie danymi

Aby zarządzać danymi, najpierw musimy utworzyć instancję bazy danych.

potem możemy wstawiać, usuwać i aktualizować bazę danych.

Upewnij się, że wszystkie operacje powinny być wykonywane w innym wątku. W moim przypadku używam Executers (zobacz tutaj)

Query:

Insert:

Delete:

Update:

Wykonanie z Executer

.

Podlinkowałem też repo jeśli potrzebujesz zobaczyć przykład Room Database.

Dodaj komentarz