Signatur
Beschreibung
Die Eigenschaft autoIncrement eines IDBObjectStore liefert den Wert des Auto-Increment-Flags, das beim Anlegen des Stores über IDBDatabase.createObjectStore(name, { autoIncrement: true }) gesetzt wurde. Ist das Flag aktiv, besitzt der Store einen Schlüsselgenerator, der bei jedem Einfügen ohne expliziten Schlüssel eine fortlaufende Ganzzahl (beginnend bei 1) vergibt.
Nützlich ist die Eigenschaft vor allem in generischem Code – etwa in Datenbank-Hilfsbibliotheken, Export-/Import-Werkzeugen oder Migrationsskripten –, der zur Laufzeit herausfinden muss, ob beim Aufruf von add() bzw. put() ein Schlüssel mitgegeben werden muss oder ob die Datenbank ihn selbst erzeugt.
Zusammen mit keyPath ergibt sich das Schlüsselverhalten des Stores: Bei keyPath + autoIncrement wird der generierte Schlüssel direkt in das Objekt geschrieben (z. B. in id); ohne keyPath bleibt der Schlüssel „out-of-line“ und wird nur als Rückgabewert der Anfrage geliefert.
Rückgabewert
true, wenn der Store einen Schlüsselgenerator besitzt, sonst false. Der Wert ist nach dem Anlegen des Stores unveränderlich.Beispiele
Store mit Auto-Increment anlegen und Flag prüfen
const request = indexedDB.open('notizen-db', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const store = db.createObjectStore('notizen', { keyPath: 'id', autoIncrement: true });
console.log('autoIncrement:', store.autoIncrement);
};
Generisch einfügen – Schlüssel nur bei Bedarf übergeben
const speichern = (db, storeName, wert, schluessel) =>
new Promise((resolve, reject) => {
const tx = db.transaction(storeName, 'readwrite');
const store = tx.objectStore(storeName);
// Out-of-line-Schlüssel ohne Generator muss explizit übergeben werden
const brauchtSchluessel = store.keyPath === null && !store.autoIncrement;
if (brauchtSchluessel && schluessel === undefined) {
reject(new Error(`Store "${storeName}" benötigt einen expliziten Schlüssel`));
return;
}
const req = brauchtSchluessel ? store.add(wert, schluessel) : store.add(wert);
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
// Nutzung
const open = indexedDB.open('notizen-db', 1);
open.onsuccess = async () => {
const id = await speichern(open.result, 'notizen', { text: 'Einkaufen' });
console.log('Neue ID:', id);
};
Schema aller Stores ausgeben
const open = indexedDB.open('notizen-db');
open.onsuccess = () => {
const db = open.result;
const namen = [...db.objectStoreNames];
if (namen.length === 0) return;
const tx = db.transaction(namen, 'readonly');
for (const name of namen) {
const store = tx.objectStore(name);
console.log(`${name}: keyPath=${JSON.stringify(store.keyPath)}, autoIncrement=${store.autoIncrement}`);
}
};
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
store.autoIncrement = truehat keine Wirkung (im Strict ModeTypeError). Das Flag lässt sich nur beim Anlegen festlegen; zum Ändern muss der Store in einemupgradeneeded-Handler gelöscht und neu erstellt werden (Daten vorher sichern!). - Zähler wird nie zurückgesetzt: Auch nach
delete()oderclear()läuft der Generator weiter; Lücken in den IDs sind normal. Nur Abbruch der Transaktion setzt den Zähler zurück. - Wird ein expliziter numerischer Schlüssel größer als der aktuelle Zählerstand eingefügt, springt der Generator auf diesen Wert + 1.
- Der Maximalwert ist 253; danach schlägt
add()mitConstraintErrorfehl. - Bei
autoIncrementzusammen mit einem Array-keyPathwirftcreateObjectStore()einenInvalidAccessError. - Kompatibilität: In allen modernen Browsern verfügbar, auch in Web Workern; nicht in Node.js ohne Polyfill (z. B.
fake-indexeddb).