Signatur
Beschreibung
Mit delete() entfernen Sie Datensätze aus einem Object Store in IndexedDB. Übergeben Sie entweder einen einzelnen Schlüssel, dann wird genau dieser Datensatz gelöscht, oder ein IDBKeyRange, dann werden alle Datensätze gelöscht, deren Primärschlüssel im Bereich liegen. Das Löschen läuft asynchron. Die Methode gibt sofort ein IDBRequest zurück, dessen success-Ereignis ausgelöst wird, sobald die Operation abgeschlossen ist.
Die Methode kann nur innerhalb einer Transaktion im Modus "readwrite" (oder "versionchange") aufgerufen werden. Ob eine Änderung dauerhaft gespeichert ist, erfahren Sie zuverlässig erst über das complete-Ereignis der Transaktion, nicht schon über success der einzelnen Anfrage.
Wichtig: Existiert kein Datensatz zum angegebenen Schlüssel, ist das kein Fehler. Die Anfrage endet trotzdem mit success, und request.result ist undefined. Wenn Sie wissen müssen, ob tatsächlich etwas gelöscht wurde, prüfen Sie vorher mit get() oder count(). Einträge in Indizes des Stores werden automatisch mitgelöscht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $query Pflicht | IDBValidKey | IDBKeyRange | Schlüssel des zu löschenden Datensatzes (z. B. number, string, Date, ArrayBuffer oder Array) oder ein IDBKeyRange für mehrere Datensätze. |
Rückgabewert
IDBRequest-Objekt. Nach erfolgreichem Abschluss ist result gleich undefined. Weitere Ereignisse auf diesem Objekt beziehen sich auf die Löschoperation.Beispiele
Einzelnen Datensatz per Schlüssel löschen
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
openReq.result.createObjectStore('products', { keyPath: 'id' });
};
openReq.onsuccess = () => {
const db = openReq.result;
const tx = db.transaction('products', 'readwrite');
const store = tx.objectStore('products');
const req = store.delete(42);
req.onsuccess = () => console.log('Löschanfrage erfolgreich:', req.result);
req.onerror = () => console.error('Fehler:', req.error);
tx.oncomplete = () => console.log('Transaktion abgeschlossen');
};
Mehrere Datensätze über IDBKeyRange löschen
// Löscht alle Log-Einträge mit Zeitstempel-Schlüssel älter als 30 Tage
const deleteOldLogs = (db) => {
const tx = db.transaction('logs', 'readwrite');
const store = tx.objectStore('logs');
const cutoff = Date.now() - 30 * 24 * 60 * 60 * 1000;
store.delete(IDBKeyRange.upperBound(cutoff, true));
return new Promise((resolve, reject) => {
tx.oncomplete = () => resolve('Alte Logs entfernt');
tx.onerror = () => reject(tx.error);
tx.onabort = () => reject(tx.error);
});
};
Promise-Wrapper mit Existenzprüfung
const promisify = (req) => new Promise((resolve, reject) => {
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const deleteIfExists = async (db, storeName, key) => {
const tx = db.transaction(storeName, 'readwrite');
const store = tx.objectStore(storeName);
const count = await promisify(store.count(key));
if (count === 0) return false;
await promisify(store.delete(key));
return true;
};
// Aufruf: const deleted = await deleteIfExists(db, 'products', 42);
// console.log(deleted);
// Wichtig · Fallstricke
- Kein Fehler bei fehlendem Schlüssel: Wird ein nicht vorhandener Schlüssel gelöscht, feuert trotzdem
success. Brauchen Sie eine Rückmeldung, prüfen Sie vorher mitcount()oderget(). ReadOnlyErrorwird geworfen, wenn die Transaktion im Modus"readonly"läuft.TransactionInactiveError: Die Transaktion wird automatisch beendet, sobald keine Anfragen mehr offen sind. Wenn Sie zwischen den Anfragen auf einawaitwarten, das nichts mit IndexedDB zu tun hat (z. B.fetch), ist die Transaktion danach oft schon geschlossen.DataErrorwird geworfen, wennqueryweder ein gültiger Schlüssel noch einIDBKeyRangeist.InvalidStateErrorkommt, wenn der Store gelöscht wurde.- Um alle Datensätze auf einmal zu löschen, ist
clear()effizienter als ein Bereich, der alles abdeckt. - Über einen Index (
IDBIndex) können Sie nicht direkt löschen. Nutzen Sie dafür einen Cursor mitIDBCursor.delete(). - Kompatibilität: Wird von allen modernen Browsern unterstützt. In privaten Fenstern mancher Browser ist IndexedDB eingeschränkt oder nur temporär verfügbar.