Start · Sprachen · JavaScript · Referenz · IDBVersionChangeEvent.oldVersion

IDBVersionChangeEvent.oldVersion

Eigenschaft

Die schreibgeschützte Eigenschaft <code>oldVersion</code> liefert die bisherige Versionsnummer einer IndexedDB-Datenbank vor einer Versionsänderung.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

IDBVersionChangeEvent.oldVersion

Beschreibung

Die Eigenschaft oldVersion des IDBVersionChangeEvent-Interfaces ist schreibgeschützt. Sie enthält die Versionsnummer, die die Datenbank vor der angeforderten Änderung hatte. Das Event wird bei upgradeneeded, versionchange, blocked sowie beim erfolgreichen Löschen einer Datenbank (deleteDatabase()) ausgelöst.

Am meisten braucht man sie im onupgradeneeded-Handler von indexedDB.open(). Anhand von oldVersion lassen sich schrittweise Schema-Migrationen umsetzen: Jeder Migrationsschritt läuft nur, wenn die bisherige Version kleiner ist als die Zielversion dieses Schritts. So kommen Nutzer mit beliebig alten Datenbankständen immer beim aktuellen Schema an.

Existierte die Datenbank bisher gar nicht, ist oldVersion gleich 0. Daran erkennt man zuverlässig die Erstinstallation. Die neue Zielversion steht im Gegenstück newVersion.

Rückgabewert

Typ
number
Beschreibung
Eine ganze Zahl (unsigned long long) mit der bisherigen Datenbankversion. Hat die Datenbank vorher nicht existiert, ist der Wert 0.

Beispiele

Erstinstallation oder Upgrade erkennen

const request = indexedDB.open('notizen', 1);

request.onupgradeneeded = (event) => {
  const db = event.target.result;
  if (event.oldVersion === 0) {
    console.log('Neue Datenbank wird angelegt');
    db.createObjectStore('notes', { keyPath: 'id', autoIncrement: true });
  } else {
    console.log(`Upgrade von Version ${event.oldVersion} auf ${event.newVersion}`);
  }
};

request.onsuccess = () => console.log('Datenbank bereit');
Neue Datenbank wird angelegt Datenbank bereit

Schrittweise Schema-Migration

const DB_VERSION = 3;
const request = indexedDB.open('shop', DB_VERSION);

request.onupgradeneeded = (event) => {
  const db = request.result;
  const tx = request.transaction; // Upgrade-Transaktion

  // Jeder Schritt läuft nur, wenn er noch nicht angewendet wurde
  if (event.oldVersion < 1) {
    db.createObjectStore('products', { keyPath: 'sku' });
  }
  if (event.oldVersion < 2) {
    tx.objectStore('products').createIndex('byCategory', 'category');
  }
  if (event.oldVersion < 3) {
    db.createObjectStore('orders', { keyPath: 'orderId' });
  }
  console.log(`Migriert: v${event.oldVersion} → v${event.newVersion}`);
};
Migriert: v0 → v3

Andere Tabs bei Versionswechsel informieren

const openDb = () => new Promise((resolve, reject) => {
  const req = indexedDB.open('app', 2);
  req.onsuccess = () => {
    const db = req.result;
    // Wird ausgelöst, wenn ein anderer Tab eine neuere Version öffnet
    db.onversionchange = (event) => {
      console.log(`Version ${event.oldVersion} wird ersetzt durch ${event.newVersion}`);
      db.close();
      alert('Bitte Seite neu laden – es gibt ein Update.');
    };
    resolve(db);
  };
  req.onerror = () => reject(req.error);
});

const db = await openDb();
Version 2 wird ersetzt durch 3

// Wichtig · Fallstricke

  • Kein switch mit break: Wer Migrationen per switch (event.oldVersion) schreibt, muss auf break verzichten und absichtlich durchfallen lassen. Sonst werden Zwischenschritte übersprungen. Die Variante mit if (oldVersion < n) ist robuster.
  • Beim Löschen einer Datenbank per indexedDB.deleteDatabase() enthält oldVersion die zuletzt gültige Version und newVersion ist null.
  • Schema-Änderungen wie createObjectStore() oder createIndex() sind nur innerhalb von upgradeneeded erlaubt. Anderswo lösen sie einen InvalidStateError aus.
  • Ein Downgrade, also das Öffnen mit einer kleineren Version als der gespeicherten, schlägt mit einem VersionError fehl. upgradeneeded wird dann nicht ausgelöst.
  • Die Eigenschaft wird von allen modernen Browsern unterstützt, auch in Web Workern. Ältere Implementierungen gaben teils Zeichenketten als Version zurück. Das ist heute nicht mehr relevant.