1 00:00:02,100 --> 00:00:05,240 Tauchen wir also in SQLite ein. Wieder haben wir ein 2 00:00:05,300 --> 00:00:11,100 Modul für das von expo unterstützte bekommen, das wir genauso installieren wie die anderen nativen 3 00:00:11,130 --> 00:00:12,120 Module und 4 00:00:12,120 --> 00:00:18,570 jetzt nur ein paar kurze Worte zu SQLite. SQLite ist ein Datenbanksystem, das sowohl für iOS als 5 00:00:18,570 --> 00:00:22,840 auch für Android verfügbar ist. Sie können dort also schnell eine solche 6 00:00:22,860 --> 00:00:30,240 Datenbank einrichten. Mit diesem Modul ist dies sehr einfach. Anschließend können Sie eine SQL-Syntax und eine grundlegende SQL-Syntax verwenden um 7 00:00:30,570 --> 00:00:32,860 Abfragen für diese Datenbank auszuführen. 8 00:00:32,940 --> 00:00:39,030 Jetzt werde ich hier nicht tief in die SQL-Syntax eintauchen, da dies offensichtlich kein SQL-Kurs ist. 9 00:00:39,030 --> 00:00:41,730 Um jedoch alles darüber zu erfahren, wie 10 00:00:41,730 --> 00:00:50,880 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 11 00:00:50,880 --> 00:00:56,550 zur Verwendung des SQLite-Pakets in einer Expo-App, in der Sie weitere Beispiele zum Löschen von 12 00:00:56,550 --> 00:01:02,460 Inhalten usw. finden. Außerdem finden Sie eine SQL-Referenz für SQLite, in der Sie mehr über die 13 00:01:02,460 --> 00:01:03,990 SQL-Syntax erfahren können. 14 00:01:03,990 --> 00:01:06,630 Ich werde jetzt in diesem Modul einige grundlegende Syntax 15 00:01:06,720 --> 00:01:10,360 zeigen, aber für alle Dinge, die Sie in Ihren Abfragen tun können, für alle 16 00:01:10,470 --> 00:01:17,170 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 17 00:01:17,170 --> 00:01:24,010 expo-sqlite in unserem Projekt ausführen. Dies wird hier in unserem Projekt installiert und funktioniert sofort wie zuvor. Es 18 00:01:24,010 --> 00:01:27,250 ist keine zusätzliche Konfiguration erforderlich. Sobald diese 19 00:01:28,510 --> 00:01:32,720 Installation abgeschlossen ist, können wir Beginnen Sie mit SQLite zu arbeiten. 20 00:01:32,830 --> 00:01:35,750 Die Arbeit mit der Datenbank umfasst einige Dinge: Sie 21 00:01:35,770 --> 00:01:41,020 müssen beispielsweise eine Verbindung zur Datenbank herstellen. Wenn noch keine Datenbank vorhanden ist, was der Fall ist, wenn 22 00:01:41,020 --> 00:01:46,260 Sie zum ersten Mal während der Lebensdauer Ihrer App darauf zugreifen, wird auch diese Datenbank erstellt und 23 00:01:46,450 --> 00:01:51,070 nachdem Sie diese Verbindung zu dieser erstellten Datenbank hergestellt haben, können Sie natürlich Abfragen für 24 00:01:51,070 --> 00:01:52,090 diese Datenbank ausführen. 25 00:01:52,090 --> 00:01:57,310 Dafür füge ich tatsächlich einen Helferordner mit einer Datenbank hinzu. js-Datei dort, die Sie nicht tun müssen, 26 00:01:57,310 --> 00:02:03,220 aber ich möchte meine Datenbanklogik dort haben, um meine anderen Dateien schlank zu halten, und damit ich eine 27 00:02:03,220 --> 00:02:10,210 Datei habe, in der wir die gesamte Datenbanklogik sehen können. Jetzt können wir SQLite aus dem Paket importieren, und wie Sie 28 00:02:10,290 --> 00:02:13,810 sehen, unterscheidet sich die Importsyntax jetzt ein wenig von der der anderen Pakete. 29 00:02:13,980 --> 00:02:19,320 Anstatt star als SQLite aus diesem Paket zu importieren, installieren wir es hier mit dieser benannten Importsyntax. 30 00:02:19,320 --> 00:02:20,300 Abgesehen davon 31 00:02:20,310 --> 00:02:22,180 ist es immer noch sehr ähnlich 32 00:02:22,500 --> 00:02:25,110 und jetzt können wir dieses Paket hier verwenden. 33 00:02:25,260 --> 00:02:31,080 Zunächst erstelle ich eine Datenbankkonstante, die einen Verweis auf meine Datenbank enthält, die ich durch 34 00:02:31,080 --> 00:02:34,290 Ausführen der offenen SQLite-Datenbank erhalte, und übergebe dort einen 35 00:02:34,290 --> 00:02:39,020 Datenbanknamen, der Orte sein kann. db. 36 00:02:39,060 --> 00:02:43,980 Jetzt wird eine Verbindung zu dieser Datenbank hergestellt oder die Datenbank erstellt, wenn sie nicht gefunden werden kann. Wenn wir also 37 00:02:44,010 --> 00:02:48,990 die App zum ersten Mal gestartet haben und Sie nichts weiter tun müssen, um Zugriff auf die Datenbank zu erhalten, ist 38 00:02:49,080 --> 00:02:50,370 dies der Fall sehr trivial. 39 00:02:50,380 --> 00:02:55,110 Jetzt wird diese Codezeile immer dann ausgeführt, wenn wir diese Datei ausführen. Dies geschieht effektiv, wenn 40 00:02:55,170 --> 00:02:57,870 wir diese Datei zum ersten Mal irgendwo importieren. 41 00:02:57,990 --> 00:03:04,320 Jetzt möchte ich hier auch eine Init-Funktion hinzufügen, die in einer Konstante gespeichert ist, die ich zum 42 00:03:04,320 --> 00:03:08,890 Initialisieren dieser Datenbank verwende, und diese Funktion als benannten Export exportieren. 43 00:03:08,910 --> 00:03:15,300 In dieser Funktion möchte ich sicherstellen, dass wir eine Basistabelle erstellen, da SQL-Datenbanken mit Tabellen arbeiten, die 44 00:03:15,300 --> 00:03:21,450 Ihre Datensätze enthalten, und Datensätze im Grunde die Datenzeilen sind, die Sie Ihrer Tabelle hinzufügen. 45 00:03:21,450 --> 00:03:27,420 Wenn wir die Datenbank erstellen, ist sie zunächst leer, aber um Orte zu speichern, benötigen wir eine Tabelle, 46 00:03:27,420 --> 00:03:29,200 die diese Orte enthalten kann. 47 00:03:29,220 --> 00:03:35,190 Daher möchte ich hier eine Initialisierungsfunktion haben, die diese Tabelle tatsächlich erstellt, wenn sie noch nicht vorhanden 48 00:03:35,190 --> 00:03:35,900 ist. 49 00:03:36,690 --> 00:03:44,780 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 50 00:03:44,790 --> 00:03:50,220 in der Datenbank angeboten wird. All dies finden Sie natürlich in den 51 00:03:50,220 --> 00:03:51,560 offiziellen Dokumenten. 52 00:03:51,780 --> 00:03:57,570 Diese Transaktionsmethode verwendet eine Funktion als Argument, mit der Sie auf das für 53 00:03:57,660 --> 00:03:59,620 Sie erstellte Transaktionsobjekt zugreifen können. 54 00:03:59,750 --> 00:04:06,870 Das Konzept von Transaktionen ist einfach ein Konzept, bei dem dieses Paket am Ende garantiert, dass Ihre Abfrage immer 55 00:04:06,870 --> 00:04:13,200 als Ganzes ausgeführt wird und dass, wenn ein Teil der Abfrage fehlschlägt, die gesamte Abfrage zurückgesetzt wird, 56 00:04:13,200 --> 00:04:17,340 damit Sie nicht enden können Bei beschädigten Daten in Ihrer 57 00:04:17,340 --> 00:04:21,670 Datenbank wickeln Sie daher jede Abfrage in eine solche Transaktion ein. 58 00:04:21,750 --> 00:04:26,760 Dies erstellt also eine Transaktion oder initialisiert eine Transaktion und gibt Ihnen dann in 59 00:04:26,790 --> 00:04:30,830 dieser Funktion Zugriff auf dieses Transaktionsobjekt, das für Sie ausgeführt wird. 60 00:04:30,840 --> 00:04:37,890 Hier können wir nun dieses Transaktionsobjekt verwenden, um eine SQL-Abfrage mit Hilfe der 61 00:04:37,890 --> 00:04:39,450 Methode execute 62 00:04:39,450 --> 00:04:48,260 SQL auszuführen, die auch hier ebenfalls dokumentiert ist. SQL ausführen führt nun eine Zeichenfolge aus, die Ihre SQL-Abfrage 63 00:04:48,530 --> 00:04:52,500 beschreibt. In diesem Teil können Sie in das zuvor 64 00:04:52,520 --> 00:04:57,450 erwähnte SQL-Dokument eintauchen, in dem Sie alles über die SQL-Sprache erfahren können. 65 00:04:57,560 --> 00:05:02,840 Jetzt möchte ich hier eine Tabelle erstellen, die wir mit dem Befehl create table ausführen, und 66 00:05:02,870 --> 00:05:03,980 Sie müssen dies 67 00:05:03,980 --> 00:05:11,600 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 68 00:05:11,600 --> 00:05:12,590 Erstelle die 69 00:05:12,590 --> 00:05:19,130 Tabelle, wenn sie nicht existiert, was wir mit der Einschränkung tun, wenn sie nicht existiert, und jetzt wird der Name 70 00:05:19,130 --> 00:05:20,750 der Tabelle Orte sein, Kleinbuchstaben, 71 00:05:20,750 --> 00:05:23,300 das ist meine eigene dynamische Sache hier, richtig, 72 00:05:23,360 --> 00:05:28,760 ich möchte sie Orte nennen und jetzt dazwischen In Klammern konfigurieren Sie, was in der Tabelle enthalten 73 00:05:28,760 --> 00:05:31,110 ist, und können anschließend ein Semikolon hinzufügen. 74 00:05:31,130 --> 00:05:35,420 Nun definieren wir die verschiedenen Felder, die wir in dieser Tabelle haben möchten, 75 00:05:35,450 --> 00:05:42,380 sozusagen die verschiedenen Spalten, und ich möchte eine ID-Spalte haben, und ich werde diese so einrichten, dass sie vom Typ Integer 76 00:05:42,380 --> 00:05:44,660 ist, einer der unterstützten Datentypen in 77 00:05:44,660 --> 00:05:50,360 SQL und es wird ein Primärschlüssel sein, was bedeutet, dass er auch gezwungen sein muss, eindeutig zu sein. 78 00:05:50,360 --> 00:05:55,400 Sie können nicht zweimal dieselbe ID haben und diese ID wird automatisch für Sie generiert, 79 00:05:55,400 --> 00:05:57,880 was sehr praktisch ist und nicht null 80 00:05:57,890 --> 00:06:03,680 sein sollte Ein leerer Wert ist dort nicht erlaubt. Jetzt können wir mit einem Komma die 81 00:06:03,680 --> 00:06:08,030 nächste Spalte hinzufügen, die wir haben möchten, und das wird mein Titel sein. 82 00:06:08,030 --> 00:06:14,460 Jetzt sollte der Titel vom Typ Text sein und Sie können dort auch nicht null hinzufügen, wenn Sie möchten. Alle 83 00:06:14,670 --> 00:06:17,200 meine Daten sollten eigentlich nicht null sein. 84 00:06:17,670 --> 00:06:22,860 Jetzt möchte ich neben dem Titel auch das imageUri dort speichern und das ist auch Text, der 85 00:06:22,860 --> 00:06:24,110 nicht null ist. 86 00:06:24,120 --> 00:06:28,950 Es ist natürlich Text und keine Datei oder ähnliches, weil wir die Datei nicht 87 00:06:29,220 --> 00:06:34,020 in der Datenbank speichern, sondern den Pfad zu der Datei in der Datenbank, die 88 00:06:34,020 --> 00:06:40,530 eine Zeichenfolge ist, und jetzt etwas anderes, das wir später benötigen Ich möchte auch schon meine Adresse einrichten, die ein 89 00:06:40,530 --> 00:06:47,760 Text ist, das sollte eine Zeichenfolge sein, die die Adresse des Ortes und ein Breitengradfeld beschreibt, oder einfach lat, die eine reelle 90 00:06:47,760 --> 00:06:54,990 ist, die am Ende eine Gleitkommazahl ist und die Längengrad hier abgekürzt mit lng, was auch ein real ist und diese alle 91 00:06:55,050 --> 00:06:56,330 nicht null sind. 92 00:06:56,340 --> 00:07:03,090 Jetzt holen wir den Ort noch nicht ab, aber wir werden es später tun und einen Ort 93 00:07:03,090 --> 00:07:10,080 als eine Kombination aus Längen- und Breitengrad ausdrücken, die die Standardmethode zum Ausdrücken von Punkten auf der Welt ist. 94 00:07:10,110 --> 00:07:14,150 Dies erstellt jetzt eine solche Tabelle, wenn sie noch nicht existiert. 95 00:07:14,150 --> 00:07:20,130 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 96 00:07:20,130 --> 00:07:22,500 kommen und die wir noch nicht benötigen. Dies 97 00:07:22,590 --> 00:07:26,850 wären dynamische Argumente, die Sie in diese Abfrage einfügen können, die wir hier und hier jedoch nicht 98 00:07:27,120 --> 00:07:33,810 benötigen dann haben wir hier zwei Funktionen als Argument Nummer drei und vier. Die erste Funktion, die wir übergeben, ist 99 00:07:33,810 --> 00:07:35,790 eine Erfolgsfunktion, die ausgeführt 100 00:07:36,000 --> 00:07:38,940 wird, wenn dieser Befehl erfolgreich war. 101 00:07:38,940 --> 00:07:43,140 Das zweite Argument ist eine Fehlerfunktion, die ausgeführt wird, wenn dies fehlschlägt. 102 00:07:43,200 --> 00:07:48,930 Nun wird das erste Argument für jede Funktion hier und diese Funktionen natürlich in Ihrem Namen vom SQL-Paket 103 00:07:48,930 --> 00:07:50,510 ausgeführt. Diese Funktionen erhalten 104 00:07:50,520 --> 00:07:54,990 also immer als erstes Argument im Grunde die von Ihnen ausgeführte Abfrage, und indem 105 00:07:55,140 --> 00:07:59,490 ich hier einen Unterstrich als Namen hinzufüge, signalisiere ich dies Das interessiert mich 106 00:07:59,490 --> 00:08:01,740 nicht, aber ich interessiere mich für 107 00:08:01,740 --> 00:08:10,130 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. 108 00:08:10,170 --> 00:08:17,100 Hier erstelle ich ein Versprechen, indem ich ein neues Versprechen verwende, Versprechen, die in Javascript integriert sind und von der 109 00:08:17,100 --> 00:08:23,820 Javascript-Version unterstützt werden. React Native verwendet und verspricht eine Funktion, die eine Auflösungs- und eine Ablehnungsfunktion als Argument verwendet, 110 00:08:23,910 --> 00:08:25,290 und jetzt können 111 00:08:25,800 --> 00:08:32,190 wir diese Datenbank verschieben Transaktionscode dort und im Erfolgsfall rufe ich Auflösung auf, was bedeutet, dass das äußere 112 00:08:32,220 --> 00:08:37,200 Versprechen aufgelöst wird. Im Fehlerfall rufe ich Ablehnung auf und leite meinen Fehler hier 113 00:08:37,200 --> 00:08:41,220 weiter. Dann kann ich das Versprechen hier insgesamt in meiner Init-Methode 114 00:08:41,220 --> 00:08:47,400 und zurückgeben Jetzt kann ich die init-Methode von anderen Stellen in der App aus aufrufen und erhalte 115 00:08:47,400 --> 00:08:52,220 ein Versprechen zurück, das sich auflöst, wenn die Datenbank erfolgreich initialisiert wurde, also die 116 00:08:52,230 --> 00:08:58,440 Tabelle erstellt wurde oder ein Fehler aufgetreten ist. Übrigens, wenn keine Tabelle erstellt wird, weil sie bereits 117 00:08:58,440 --> 00:09:06,680 vorhanden ist, erhalten wir keinen Fehler, aber wir werden trotzdem in einem Erfolgsfall enden. Damit speichern wir immer noch nichts in der 118 00:09:06,680 --> 00:09:10,100 Datenbank, sondern richten die Datenbank ein. 119 00:09:10,100 --> 00:09:15,260 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 120 00:09:15,260 --> 00:09:18,060 die Datenbank beim Start unserer 121 00:09:18,140 --> 00:09:25,700 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 122 00:09:25,700 --> 00:09:30,620 nicht überraschend ist die Funktion und daher hier bei dieser App. js Datei wird ausgeführt, wenn wir auch 123 00:09:30,750 --> 00:09:37,550 den Redux-Speicher initialisieren und so weiter, möchte ich init hier aufrufen und jetzt ist init entweder erfolgreich oder nicht, 124 00:09:37,550 --> 00:09:45,380 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 125 00:09:45,770 --> 00:09:46,520 oder 126 00:09:46,550 --> 00:09:54,200 ein Catch-Block, bei dem ein potenzieller Fehler auftritt, bei dem die Initialisierung der Datenbank durch das Konsolenprotokoll fehlgeschlagen ist und bei dem 127 00:09:54,230 --> 00:10:03,610 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 128 00:10:04,000 --> 00:10:09,880 sehen, die die Ausgabe vom iPhone ist, und jetzt, da es auf Android gestartet wurde, sehen Sie 129 00:10:09,880 --> 00:10:11,920 es dort auch für Android. 130 00:10:12,070 --> 00:10:18,610 Damit das funktioniert und wir jetzt eine Datenbank initialisiert haben, können wir jetzt auch weitere Methoden hinzufügen, um sicherzustellen, dass wir 131 00:10:18,610 --> 00:10:21,820 auch Daten einfügen und später natürlich auch Daten abrufen können.