Tauchen wir also in SQLite ein. Wieder haben wir ein
Modul für das von expo unterstützte bekommen, das wir genauso installieren wie die anderen nativen
Module und
jetzt nur ein paar kurze Worte zu SQLite. SQLite ist ein Datenbanksystem, das sowohl für iOS als
auch für Android verfügbar ist. Sie können dort also schnell eine solche
Datenbank einrichten. Mit diesem Modul ist dies sehr einfach. Anschließend können Sie eine SQL-Syntax und eine grundlegende SQL-Syntax verwenden um
Abfragen für diese Datenbank auszuführen.
Jetzt werde ich hier nicht tief in die SQL-Syntax eintauchen, da dies offensichtlich kein SQL-Kurs ist.
Um jedoch alles darüber zu erfahren, wie
man das verwendet, lesen Sie natürlich die offiziellen Dokumente und den Anhang. Außerdem finden Sie einen Link mit einem detaillierteren Snippet, der taucht Informationen
zur Verwendung des SQLite-Pakets in einer Expo-App, in der Sie weitere Beispiele zum Löschen von
Inhalten usw. finden. Außerdem finden Sie eine SQL-Referenz für SQLite, in der Sie mehr über die
SQL-Syntax erfahren können.
Ich werde jetzt in diesem Modul einige grundlegende Syntax
zeigen, aber für alle Dinge, die Sie in Ihren Abfragen tun können, für alle
Befehle, die Sie ausführen können, überprüfen Sie auf jeden Fall diese Ressourcen. Fügen wir nun SQLite hinzu, indem wir expo install
expo-sqlite in unserem Projekt ausführen. Dies wird hier in unserem Projekt installiert und funktioniert sofort wie zuvor. Es
ist keine zusätzliche Konfiguration erforderlich. Sobald diese
Installation abgeschlossen ist, können wir Beginnen Sie mit SQLite zu arbeiten.
Die Arbeit mit der Datenbank umfasst einige Dinge: Sie
müssen beispielsweise eine Verbindung zur Datenbank herstellen. Wenn noch keine Datenbank vorhanden ist, was der Fall ist, wenn
Sie zum ersten Mal während der Lebensdauer Ihrer App darauf zugreifen, wird auch diese Datenbank erstellt und
nachdem Sie diese Verbindung zu dieser erstellten Datenbank hergestellt haben, können Sie natürlich Abfragen für
diese Datenbank ausführen.
Dafür füge ich tatsächlich einen Helferordner mit einer Datenbank hinzu. js-Datei dort, die Sie nicht tun müssen,
aber ich möchte meine Datenbanklogik dort haben, um meine anderen Dateien schlank zu halten, und damit ich eine
Datei habe, in der wir die gesamte Datenbanklogik sehen können. Jetzt können wir SQLite aus dem Paket importieren, und wie Sie
sehen, unterscheidet sich die Importsyntax jetzt ein wenig von der der anderen Pakete.
Anstatt star als SQLite aus diesem Paket zu importieren, installieren wir es hier mit dieser benannten Importsyntax.
Abgesehen davon
ist es immer noch sehr ähnlich
und jetzt können wir dieses Paket hier verwenden.
Zunächst erstelle ich eine Datenbankkonstante, die einen Verweis auf meine Datenbank enthält, die ich durch
Ausführen der offenen SQLite-Datenbank erhalte, und übergebe dort einen
Datenbanknamen, der Orte sein kann. db.
Jetzt wird eine Verbindung zu dieser Datenbank hergestellt oder die Datenbank erstellt, wenn sie nicht gefunden werden kann. Wenn wir also
die App zum ersten Mal gestartet haben und Sie nichts weiter tun müssen, um Zugriff auf die Datenbank zu erhalten, ist
dies der Fall sehr trivial.
Jetzt wird diese Codezeile immer dann ausgeführt, wenn wir diese Datei ausführen. Dies geschieht effektiv, wenn
wir diese Datei zum ersten Mal irgendwo importieren.
Jetzt möchte ich hier auch eine Init-Funktion hinzufügen, die in einer Konstante gespeichert ist, die ich zum
Initialisieren dieser Datenbank verwende, und diese Funktion als benannten Export exportieren.
In dieser Funktion möchte ich sicherstellen, dass wir eine Basistabelle erstellen, da SQL-Datenbanken mit Tabellen arbeiten, die
Ihre Datensätze enthalten, und Datensätze im Grunde die Datenzeilen sind, die Sie Ihrer Tabelle hinzufügen.
Wenn wir die Datenbank erstellen, ist sie zunächst leer, aber um Orte zu speichern, benötigen wir eine Tabelle,
die diese Orte enthalten kann.
Daher möchte ich hier eine Initialisierungsfunktion haben, die diese Tabelle tatsächlich erstellt, wenn sie noch nicht vorhanden
ist.
Dort kann ich also meine Datenbankkonstante verwenden, die auf diese Datenbank zeigt, und die Transaktion ausführen. Jetzt ist die Transaktion eine Methode, die vom SQLite-Paket
in der Datenbank angeboten wird. All dies finden Sie natürlich in den
offiziellen Dokumenten.
Diese Transaktionsmethode verwendet eine Funktion als Argument, mit der Sie auf das für
Sie erstellte Transaktionsobjekt zugreifen können.
Das Konzept von Transaktionen ist einfach ein Konzept, bei dem dieses Paket am Ende garantiert, dass Ihre Abfrage immer
als Ganzes ausgeführt wird und dass, wenn ein Teil der Abfrage fehlschlägt, die gesamte Abfrage zurückgesetzt wird,
damit Sie nicht enden können Bei beschädigten Daten in Ihrer
Datenbank wickeln Sie daher jede Abfrage in eine solche Transaktion ein.
Dies erstellt also eine Transaktion oder initialisiert eine Transaktion und gibt Ihnen dann in
dieser Funktion Zugriff auf dieses Transaktionsobjekt, das für Sie ausgeführt wird.
Hier können wir nun dieses Transaktionsobjekt verwenden, um eine SQL-Abfrage mit Hilfe der
Methode execute
SQL auszuführen, die auch hier ebenfalls dokumentiert ist. SQL ausführen führt nun eine Zeichenfolge aus, die Ihre SQL-Abfrage
beschreibt. In diesem Teil können Sie in das zuvor
erwähnte SQL-Dokument eintauchen, in dem Sie alles über die SQL-Sprache erfahren können.
Jetzt möchte ich hier eine Tabelle erstellen, die wir mit dem Befehl create table ausführen, und
Sie müssen dies
nicht in Großbuchstaben schreiben. Ich mache dies nur, um zu verdeutlichen, dass dies Standardbefehle sind, die in die SQL-Sprache integriert sind, und ich möchte
Erstelle die
Tabelle, wenn sie nicht existiert, was wir mit der Einschränkung tun, wenn sie nicht existiert, und jetzt wird der Name
der Tabelle Orte sein, Kleinbuchstaben,
das ist meine eigene dynamische Sache hier, richtig,
ich möchte sie Orte nennen und jetzt dazwischen In Klammern konfigurieren Sie, was in der Tabelle enthalten
ist, und können anschließend ein Semikolon hinzufügen.
Nun definieren wir die verschiedenen Felder, die wir in dieser Tabelle haben möchten,
sozusagen die verschiedenen Spalten, und ich möchte eine ID-Spalte haben, und ich werde diese so einrichten, dass sie vom Typ Integer
ist, einer der unterstützten Datentypen in
SQL und es wird ein Primärschlüssel sein, was bedeutet, dass er auch gezwungen sein muss, eindeutig zu sein.
Sie können nicht zweimal dieselbe ID haben und diese ID wird automatisch für Sie generiert,
was sehr praktisch ist und nicht null
sein sollte Ein leerer Wert ist dort nicht erlaubt. Jetzt können wir mit einem Komma die
nächste Spalte hinzufügen, die wir haben möchten, und das wird mein Titel sein.
Jetzt sollte der Titel vom Typ Text sein und Sie können dort auch nicht null hinzufügen, wenn Sie möchten. Alle
meine Daten sollten eigentlich nicht null sein.
Jetzt möchte ich neben dem Titel auch das imageUri dort speichern und das ist auch Text, der
nicht null ist.
Es ist natürlich Text und keine Datei oder ähnliches, weil wir die Datei nicht
in der Datenbank speichern, sondern den Pfad zu der Datei in der Datenbank, die
eine Zeichenfolge ist, und jetzt etwas anderes, das wir später benötigen Ich möchte auch schon meine Adresse einrichten, die ein
Text ist, das sollte eine Zeichenfolge sein, die die Adresse des Ortes und ein Breitengradfeld beschreibt, oder einfach lat, die eine reelle
ist, die am Ende eine Gleitkommazahl ist und die Längengrad hier abgekürzt mit lng, was auch ein real ist und diese alle
nicht null sind.
Jetzt holen wir den Ort noch nicht ab, aber wir werden es später tun und einen Ort
als eine Kombination aus Längen- und Breitengrad ausdrücken, die die Standardmethode zum Ausdrücken von Punkten auf der Welt ist.
Dies erstellt jetzt eine solche Tabelle, wenn sie noch nicht existiert.
Jetzt verwendet die Methode execute SQL auch ein zweites Argument, bei dem es sich um ein Array von Argumenten handelt, die später ins Spiel
kommen und die wir noch nicht benötigen. Dies
wären dynamische Argumente, die Sie in diese Abfrage einfügen können, die wir hier und hier jedoch nicht
benötigen dann haben wir hier zwei Funktionen als Argument Nummer drei und vier. Die erste Funktion, die wir übergeben, ist
eine Erfolgsfunktion, die ausgeführt
wird, wenn dieser Befehl erfolgreich war.
Das zweite Argument ist eine Fehlerfunktion, die ausgeführt wird, wenn dies fehlschlägt.
Nun wird das erste Argument für jede Funktion hier und diese Funktionen natürlich in Ihrem Namen vom SQL-Paket
ausgeführt. Diese Funktionen erhalten
also immer als erstes Argument im Grunde die von Ihnen ausgeführte Abfrage, und indem
ich hier einen Unterstrich als Namen hinzufüge, signalisiere ich dies Das interessiert mich
nicht, aber ich interessiere mich für
das zweite Argument, und hier wäre dies mein Fehlerobjekt. Um dies auf einfache Weise nutzbar zu machen, werde ich dies tatsächlich in ein benutzerdefiniertes Versprechen einwickeln.
Hier erstelle ich ein Versprechen, indem ich ein neues Versprechen verwende, Versprechen, die in Javascript integriert sind und von der
Javascript-Version unterstützt werden. React Native verwendet und verspricht eine Funktion, die eine Auflösungs- und eine Ablehnungsfunktion als Argument verwendet,
und jetzt können
wir diese Datenbank verschieben Transaktionscode dort und im Erfolgsfall rufe ich Auflösung auf, was bedeutet, dass das äußere
Versprechen aufgelöst wird. Im Fehlerfall rufe ich Ablehnung auf und leite meinen Fehler hier
weiter. Dann kann ich das Versprechen hier insgesamt in meiner Init-Methode
und zurückgeben Jetzt kann ich die init-Methode von anderen Stellen in der App aus aufrufen und erhalte
ein Versprechen zurück, das sich auflöst, wenn die Datenbank erfolgreich initialisiert wurde, also die
Tabelle erstellt wurde oder ein Fehler aufgetreten ist. Übrigens, wenn keine Tabelle erstellt wird, weil sie bereits
vorhanden ist, erhalten wir keinen Fehler, aber wir werden trotzdem in einem Erfolgsfall enden. Damit speichern wir immer noch nichts in der
Datenbank, sondern richten die Datenbank ein.
Stellen wir jetzt sicher, dass wir init anrufen und der Ort, an dem wir es anrufen, natürlich die App ist. js-Datei, da wir
die Datenbank beim Start unserer
App so schnell wie möglich initialisieren möchten. Also werde ich dort etwas aus meinem Helferordner importieren, aus der dortigen Datenbankdatei und das ist etwas
nicht überraschend ist die Funktion und daher hier bei dieser App. js Datei wird ausgeführt, wenn wir auch
den Redux-Speicher initialisieren und so weiter, möchte ich init hier aufrufen und jetzt ist init entweder erfolgreich oder nicht,
also füge ich jetzt einfach einen then-Block hinzu, in dem ich sage, dass das Konsolenprotokoll die Datenbank initialisiert hat Dies ist der Erfolgsfall
oder
ein Catch-Block, bei dem ein potenzieller Fehler auftritt, bei dem die Initialisierung der Datenbank durch das Konsolenprotokoll fehlgeschlagen ist und bei dem
dann auch der Fehler, den wir erhalten haben, durch die Konsole protokolliert wird. Und wenn wir dies jetzt speichern, sollten Sie es hier in der protokollinitialisierten Datenbank
sehen, die die Ausgabe vom iPhone ist, und jetzt, da es auf Android gestartet wurde, sehen Sie
es dort auch für Android.
Damit das funktioniert und wir jetzt eine Datenbank initialisiert haben, können wir jetzt auch weitere Methoden hinzufügen, um sicherzustellen, dass wir
auch Daten einfügen und später natürlich auch Daten abrufen können.