Signatur
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
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');
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}`);
};
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();
// Wichtig · Fallstricke
- Kein
switchmitbreak: Wer Migrationen perswitch (event.oldVersion)schreibt, muss aufbreakverzichten und absichtlich durchfallen lassen. Sonst werden Zwischenschritte übersprungen. Die Variante mitif (oldVersion < n)ist robuster. - Beim Löschen einer Datenbank per
indexedDB.deleteDatabase()enthältoldVersiondie zuletzt gültige Version undnewVersionistnull. - Schema-Änderungen wie
createObjectStore()odercreateIndex()sind nur innerhalb vonupgradeneedederlaubt. Anderswo lösen sie einenInvalidStateErroraus. - Ein Downgrade, also das Öffnen mit einer kleineren Version als der gespeicherten, schlägt mit einem
VersionErrorfehl.upgradeneededwird 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.