Using Room Database | Android Jetpack

Ashish Rawat

Follow

Feb 23, 2019 – 6 min read

Für diejenigen unter euch, die nicht wissen, was Android Jetpack ist, dann

Android Jetpack ist eine Sammlung von Android-Software-Komponenten, die es euch leichter machen, großartige Android-Apps zu entwickeln.
Sie werden Ihnen helfen

  • Best Practices zu befolgen
  • Sie davon zu befreien, Boilerplate-Code zu schreiben.
  • Vereinfachen Sie komplexe Aufgaben, damit Sie sich auf den Code konzentrieren können, der Ihnen wichtig ist.

Hier ist das Video aus dem Android Developers Channel:

Lassen Sie uns jetzt über Room sprechen

Room ist eine Persistenzbibliothek, Teil des Android Jetpack.

Hier ist das Video aus dem Android Developers Channel:

Room bietet eine Abstraktionsschicht über SQLite, um einen fließenden Datenbankzugriff zu ermöglichen und gleichzeitig die volle Leistungsfähigkeit von SQLite zu nutzen.

Room wird heute als besserer Ansatz für die Datenpersistenz angesehen als SQLiteDatabase. Es erleichtert die Arbeit mit SQLiteDatabase-Objekten in Ihrer Anwendung, verringert die Menge an Boilerplate-Code und überprüft SQL-Abfragen zur Kompilierzeit.

  • Überprüfung von SQL-Abfragen zur Kompilierzeit. Jede @Query und @Entity wird zur Kompilierzeit überprüft, was Ihre Anwendung vor Absturzproblemen zur Laufzeit bewahrt und nicht nur die Syntax, sondern auch fehlende Tabellen überprüft.
  • Boilerplate-Code
  • Einfache Integration mit anderen Architecture-Komponenten (wie LiveData)

Hauptprobleme bei der Verwendung von SQLite sind

  • Es gibt keine Kompilierzeitüberprüfung von rohen SQL-Abfragen. Wenn Sie z.B. eine SQL-Abfrage mit einem falschen Spaltennamen schreiben, der in der realen Datenbank nicht existiert, dann gibt es während der Laufzeit eine Ausnahme und Sie können dieses Problem während der Kompilierungszeit nicht erfassen.
  • Wenn sich Ihr Schema ändert, müssen Sie die betroffenen SQL-Abfragen manuell aktualisieren. Dieser Prozess kann zeitaufwändig und fehleranfällig sein.
  • Sie müssen viel Boilerplate-Code verwenden, um zwischen SQL-Abfragen und Java-Datenobjekten (POJO) zu konvertieren.

Room vs. SQLite

Room ist eine ORM, Object Relational Mapping Library. Mit anderen Worten, Room wird unsere Datenbankobjekte auf Java-Objekte abbilden. Room bietet eine Abstraktionsschicht über SQLite, um einen flüssigen Datenbankzugriff zu ermöglichen und gleichzeitig die volle Leistungsfähigkeit von SQLite zu nutzen.

Unterschied zwischen SQLite und der Persistenzbibliothek Room:-

  • Im Falle von SQLite gibt es keine Kompilierzeitüberprüfung von rohen SQLite-Abfragen. Aber in Room gibt es eine SQL-Validierung zur Kompilierungszeit.
  • Sie müssen viel Boilerplate-Code verwenden, um zwischen SQL-Abfragen und Java-Datenobjekten zu konvertieren. Room hingegen bildet unsere Datenbankobjekte ohne Boilerplate-Code auf Java-Objekte ab.
  • Wenn sich Ihr Schema ändert, müssen Sie die betroffenen SQL-Abfragen manuell aktualisieren. Room löst dieses Problem.
  • Room ist so konzipiert, dass es mit LiveData und RxJava zur Datenbeobachtung zusammenarbeitet, während SQLite dies nicht tut.
Room ist genial

Komponenten der Room DB

Room hat drei Hauptkomponenten der Room DB :

  • Entity
  • Dao
  • Database

Entity

Repräsentiert eine Tabelle innerhalb der Datenbank. Room erstellt eine Tabelle für jede Klasse, die eine @Entity Anotation hat, die Felder in der Klasse entsprechen den Spalten in der Tabelle. Daher sind die Entitätsklassen eher kleine Modellklassen, die keine Logik enthalten.

Entitätsannotationen

Bevor wir mit der Modellierung unserer Entitäten beginnen, müssen wir einige nützliche Annotationen und ihre Attribute kennen.

@Entity – jede Modellklasse mit dieser Annotation hat eine Mapping-Tabelle in der DB

  • foreignKeys – Namen von Fremdschlüsseln
  • indices – Liste von Indizes in der Tabelle
  • primaryKeys – Namen von Entitätsprimärschlüsseln
  • tableName

@PrimaryKey – wie der Name schon sagt, verweist diese Anmerkung auf den Primärschlüssel der Entität. autoGenerate – wenn auf true gesetzt, dann generiert SQLite eine eindeutige ID für die Spalte

@PrimaryKey(autoGenerate = true)

@ColumnInfo – erlaubt die Angabe von benutzerdefinierten Informationen über die Spalte

@ColumnInfo(name = "column_name")

@Ignore – das Feld wird von Room nicht persistiert

@Embeded – verschachtelte Felder können direkt in den SQL-Abfragen referenziert werden.

Dao

DAOs sind verantwortlich für die Definition der Methoden, die auf die Datenbank zugreifen. Im ursprünglichen SQLite verwenden wir die Cursor-Objekte. Mit Room brauchen wir den ganzen Cursor-bezogenen Code nicht und können unsere Abfragen einfach mit Annotationen in der Dao-Klasse definieren.

Database

Enthält den Datenbankhalter und dient als Hauptzugriffspunkt für die zugrunde liegende Verbindung zu den persistierten, relationalen Daten Ihrer Anwendung.

Um eine Datenbank zu erstellen, müssen wir eine abstrakte Klasse definieren, die RoomDatabase erweitert. Diese Klasse ist mit @Database annotiert und listet die Entitäten auf, die in der Datenbank enthalten sind, sowie die DAOs, die auf sie zugreifen.

Die Klasse, die mit @Database annotiert ist, sollte die folgenden Bedingungen erfüllen:

  • Eine abstrakte Klasse sein, die RoomDatabase erweitert.
  • Fügen Sie die Liste der Entitäten, die mit der Datenbank verbunden sind, in die Annotation ein.
  • Enthalten Sie eine abstrakte Methode, die 0 Argumente hat und die Klasse zurückgibt, die mit @Dao annotiert ist.

Zur Laufzeit können Sie eine Instanz von Database erwerben, indem Sie Room.databaseBuilder() oderRoom.inMemoryDatabaseBuilder() aufrufen.

Schritt 1: Fügen Sie die Gradle-Abhängigkeiten hinzu

  1. Um sie zu Ihrem Projekt hinzuzufügen, öffnen Sie die build.gradle-Datei auf Projektebene und fügen Sie die hervorgehobene Zeile wie folgt hinzu:

2. Öffnen Sie die build.gradle-Datei für Ihre App oder Ihr Modul und fügen Sie Abhängigkeiten hinzu:

Schritt 2: Erstellen einer Modellklasse

Room erstellt für jede mit @Entity annotierte Klasse eine Tabelle; die Felder in der Klasse entsprechen den Spalten in der Tabelle. Daher sind die Entitätsklassen in der Regel kleine Modellklassen, die keine Logik enthalten. Unsere Klasse Person stellt das Modell für die Daten in der Datenbank dar. Aktualisieren wir sie also, um Room mitzuteilen, dass er eine Tabelle auf der Grundlage dieser Klasse erstellen soll:

  • Bemerken Sie die Klasse mit @Entity und verwenden Sie die tableName-Eigenschaft, um den Namen der Tabelle festzulegen.
  • Setzen Sie den Primärschlüssel, indem Sie die @PrimaryKey-Bemerkung zu den richtigen Feldern hinzufügen – in unserem Fall ist dies die ID des Benutzers.
  • Setzen Sie die Namen der Spalten für die Klassenfelder mit der @ColumnInfo(name = "column_name")-Bemerkung. Sie können diesen Schritt überspringen, wenn Ihre Felder bereits den richtigen Spaltennamen haben.
  • Wenn mehrere Konstruktoren geeignet sind, fügen Sie die @Ignore-Anmerkung hinzu, um Room mitzuteilen, welche verwendet werden sollen und welche nicht.

Schritt 3: Erstellen von Datenzugriffsobjekten (DAOs)

DAOs sind für die Definition der Methoden verantwortlich, die auf die Datenbank zugreifen.

Um ein DAO zu erstellen, müssen wir eine Schnittstelle erstellen und mit @Dao annotieren.

Schritt 4 – Erstellen der Datenbank

Um eine Datenbank zu erstellen, müssen wir eine abstrakte Klasse definieren, die RoomDatabase erweitert. Diese Klasse ist mit @Database annotiert, listet die Entitäten auf, die in der Datenbank enthalten sind, und die DAOs, die auf sie zugreifen.

Schritt 4: Verwalten der Daten

Um die Daten zu verwalten, müssen wir zunächst eine Instanz der Datenbank erstellen.

Dann können wir die Datenbank einfügen, löschen und aktualisieren.

Stellen Sie sicher, dass alle Operationen in einem anderen Thread ausgeführt werden. In meinem Fall verwende ich Executers (siehe hier)

Query:

Insert:

Löschen:

Aktualisieren:

Ausführen mit Executer

Ich habe auch ein Repo verlinkt, falls ihr das Beispiel der Raumdatenbank sehen wollt.

Schreibe einen Kommentar