Start · Sprachen · JavaScript · Referenz · IDBObjectStore.delete()

IDBObjectStore.delete()

Methode

Löscht asynchron den Datensatz mit dem angegebenen Schlüssel oder alle Datensätze in einem <code>IDBKeyRange</code> und gibt ein <code>IDBRequest</code> zurück.

seit JavaScript Baseline: alle modernen Browser (IndexedDB 2.0) Kategorie: webapi

Signatur

IDBObjectStore.prototype.delete(query)

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

Typ
IDBRequest<undefined>
Beschreibung
Ein 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');
};
Löschanfrage erfolgreich: undefined 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);
true

// 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 mit count() oder get().
  • ReadOnlyError wird 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 ein await warten, das nichts mit IndexedDB zu tun hat (z. B. fetch), ist die Transaktion danach oft schon geschlossen.
  • DataError wird geworfen, wenn query weder ein gültiger Schlüssel noch ein IDBKeyRange ist. InvalidStateError kommt, 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 mit IDBCursor.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.