← React / TypeScript

React / TypeScript · 13 / 18

SQLite und Repositories in Hausakte

Du verstehst lokale SQL-Speicherung, Transaktionen und die Trennung von Geräteadaptern.

  • Mittel
  • Fortgeschritten
  • 45 min

Voraussetzungen: React Native, Expo und Navigation

Hausakte verwendet Expo SQLite auf Android. Ihre Repository-Tests verwenden echte SQLite-Dateien über Node.js. Beide Wege teilen die Repository- und Migrationsregeln. Dieses Tutorial zeigt SQL direkt mit Node SQLite, damit Fremdschlüssel und Transaktionen ohne Gerät reproduzierbar werden. Der Anwendungscode bekommt später eine SqlConnection über einen Port.

Beispieldateien

01Eine echte SQLite-Verbindung öffnen

Node.js 22.13 oder neuer enthält node:sqlite. :memory: erzeugt eine echte, aber nur für diesen Lauf bestehende SQLite-Datenbank. Eine Dateiadresse würde die Daten dauerhaft speichern. Eine mögliche Experimental-Warnung ist kein Testfehler.

database.mjs · javascriptDatei öffnen
import { DatabaseSync } from 'node:sqlite';
const db = new DatabaseSync(':memory:');
db.exec(`PRAGMA foreign_keys=ON;
  CREATE TABLE houses(id TEXT PRIMARY KEY, name TEXT NOT NULL);
  CREATE TABLE entries(id TEXT PRIMARY KEY, house_id TEXT NOT NULL REFERENCES houses(id), title TEXT NOT NULL, cost_cents INTEGER NOT NULL);`);
db.exec('BEGIN IMMEDIATE');
try {
  db.prepare('INSERT INTO houses VALUES (?, ?)').run('h1', 'Home');
  db.prepare('INSERT INTO entries VALUES (?, ?, ?, ?)').run('e1', 'h1', 'Roof', 12990);
  db.exec('COMMIT');
} catch (error) {
  db.exec('ROLLBACK');
  throw error;
}
console.log(db.prepare('SELECT title, cost_cents FROM entries').all());
db.close();

Starten / prüfen

node database.mjs

02SQL und Werte trennen

prepare erzeugt eine parametrisierte Anweisung. run bindet die Werte an ?. Sie werden nicht in einen SQL-String hineinkopiert. Das schützt auch Namen mit Anführungszeichen vor einer falschen Interpretation als SQL-Code.

03Eine Transaktion abschließen

BEGIN IMMEDIATE reserviert den Schreibzugriff. Eintrag und Akte werden gemeinsam geschrieben. catch rollt zurück. Diese Garantie gilt für SQL. Dateien im FileVault benötigen darüber hinaus koordinierte Entwürfe und Referenzregeln.

04Migrationen und Abfragen prüfen

Das echte Repository setzt Fremdschlüssel, WAL und busy_timeout. Es prüft user_version und ergänzt in Schema 2 Indizes. Tests müssen eine alte Datenbank mit vorhandenen Einträgen öffnen und danach deren Erhalt prüfen. Eine leere Neuinstallation genügt dafür nicht.

Erwartetes Ergebnis

Die Ausgabe enthält Roof und cost_cents 12990. Die Transaktion wird abgeschlossen.

Deine Übung

Füge vor COMMIT einen Eintrag für house_id missing ein. Prüfe danach in catch die Anzahl der Häuser.

Lösung mit Erklärung anzeigen

Der Fremdschlüssel schlägt fehl. Nach ROLLBACK ist auch das zuvor eingefügte Haus weg. SELECT count(*) FROM houses ergibt 0. Genau diese gemeinsame Wirkung ist der Sinn der Transaktion.

Projektbezug und Quellen

Das Beispiel ist zum Lernen vereinfacht. Die verlinkte Codeversion zeigt die Anwendung im Projekt und die dortigen Prüfungen.