Signatur
Beschreibung
Die Eigenschaft name eines IDBObjectStore enthält den Namen, unter dem der Objektspeicher in der Datenbank angelegt wurde, also den Wert, den Sie an IDBDatabase.createObjectStore() übergeben haben. Beim Lesen erhalten Sie immer eine Zeichenkette.
Meist dient das Lesen dem Debuggen oder Protokollieren. Nützlich ist es auch in generischem Code, der mit mehreren Speichern arbeitet. Dort können Sie über transaction.objectStore(name) oder db.objectStoreNames iterieren und mit store.name nachsehen, welcher Speicher gerade verarbeitet wird.
Sie können der Eigenschaft auch einen neuen Wert zuweisen und so einen Objektspeicher umbenennen, ohne seine Daten zu kopieren. Das geht aber nur innerhalb einer Upgrade-Transaktion (Modus versionchange), also im Handler von upgradeneeded. Das Umbenennen passt die Liste IDBDatabase.objectStoreNames an. Die Indizes und Datensätze des Speichers bleiben erhalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $neuerName | string | Nur beim Schreiben: der neue Name des Objektspeichers. Die Zuweisung ist nur innerhalb einer versionchange-Transaktion erlaubt. Ein Wert, der keine Zeichenkette ist, wird in eine Zeichenkette umgewandelt. |
Rückgabewert
Beispiele
Namen eines Objektspeichers auslesen
const request = indexedDB.open('shop', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
db.createObjectStore('produkte', { keyPath: 'id' });
};
request.onsuccess = (event) => {
const db = event.target.result;
const tx = db.transaction('produkte', 'readonly');
const store = tx.objectStore('produkte');
console.log(`Aktiver Speicher: ${store.name}`);
};
Objektspeicher beim Versions-Upgrade umbenennen
// Version 1 hatte einen Speicher namens 'kunden', ab Version 2 heißt er 'kontakte'
const request = indexedDB.open('crm', 2);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const tx = event.target.transaction; // versionchange-Transaktion
if (event.oldVersion < 1) {
db.createObjectStore('kontakte', { keyPath: 'id' });
} else if (event.oldVersion < 2) {
const store = tx.objectStore('kunden');
store.name = 'kontakte'; // Daten und Indizes bleiben erhalten
console.log([...db.objectStoreNames]);
}
};
Fehler beim Umbenennen außerhalb eines Upgrades
const request = indexedDB.open('shop', 1);
request.onsuccess = (event) => {
const db = event.target.result;
const store = db.transaction('produkte', 'readwrite').objectStore('produkte');
try {
store.name = 'artikel';
} catch (err) {
console.log(err.name); // nur in versionchange-Transaktionen erlaubt
}
};
Alle Speicher einer Transaktion protokollieren
const logStores = (db) => {
const names = [...db.objectStoreNames];
const tx = db.transaction(names, 'readonly');
for (const n of names) {
const store = tx.objectStore(n);
const countReq = store.count();
countReq.onsuccess = () => console.log(`${store.name}: ${countReq.result} Einträge`);
}
};
const req = indexedDB.open('shop', 1);
req.onsuccess = (e) => logStores(e.target.result);
// Wichtig · Fallstricke
In diesen Fällen löst die Zuweisung eine DOMException aus:
InvalidStateError: Die Transaktion hat nicht den Modusversionchange, oder der Objektspeicher wurde bereits gelöscht.TransactionInactiveError: Die Upgrade-Transaktion ist nicht mehr aktiv, zum Beispiel weil die Zuweisung in einemsetTimeoutoder nach einemawaitauf ein fremdes Promise ausgeführt wird.ConstraintError: In der Datenbank gibt es bereits einen Objektspeicher mit dem neuen Namen.
Wenn Sie den bisherigen Namen noch einmal zuweisen, geschieht nichts, und es wird auch kein Fehler ausgelöst. Wird die Upgrade-Transaktion abgebrochen, erhält der Speicher wieder seinen alten Namen. In älteren Browsern (vor Chrome 58, Firefox 51 und Safari 10.1) ist die Eigenschaft nur lesbar. Dort bleibt nur der Weg, einen neuen Speicher anzulegen, die Daten zu kopieren und den alten Speicher zu löschen.