Signatur
Beschreibung
get() ist die einfachste Leseoperation in IndexedDB: Du übergibst einen Primärschlüssel (oder einen IDBKeyRange) und erhältst ein IDBRequest-Objekt. Die eigentliche Suche läuft asynchron. Ist sie abgeschlossen, wird das success-Ereignis ausgelöst, und request.result enthält eine strukturierte Kopie (Structured Clone) des gespeicherten Werts.
Wird ein Schlüsselbereich übergeben, liefert get() den ersten passenden Datensatz in Schlüsselreihenfolge. Gibt es keinen Treffer, ist result undefined. Das ist kein Fehler, success wird trotzdem ausgelöst.
Die Methode muss innerhalb einer aktiven Transaktion ("readonly" oder "readwrite") aufgerufen werden, die den Store in ihrem Geltungsbereich hat. Für mehrere Datensätze nutzt du getAll(), zum Prüfen auf Existenz ohne den Wert zu laden getKey() oder count(). Suchen über Nicht-Primärschlüssel laufen über IDBIndex.get().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | any (gültiger IndexedDB-Schlüssel: number | string | Date | ArrayBuffer | Array) | IDBKeyRange | Primärschlüssel des gesuchten Datensatzes oder ein IDBKeyRange. Bei einem Bereich wird der erste passende Datensatz zurückgegeben. |
Rückgabewert
IDBRequest. Nach dem success-Ereignis enthält request.result den gefundenen Wert (strukturierte Kopie) oder undefined, wenn kein Datensatz passt.Beispiele
Einzelnen Datensatz per Primärschlüssel lesen
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
const db = openReq.result;
const store = db.createObjectStore('produkte', { keyPath: 'id' });
store.put({ id: 42, name: 'Kaffeemühle', preis: 49.9 });
};
openReq.onsuccess = () => {
const db = openReq.result;
const tx = db.transaction('produkte', 'readonly');
const request = tx.objectStore('produkte').get(42);
request.onsuccess = () => {
console.log(request.result);
};
request.onerror = () => {
console.error('Lesefehler:', request.error);
};
};
Promise-Wrapper für async/await
const promisify = (request) =>
new Promise((resolve, reject) => {
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
const ladeProdukt = async (db, id) => {
const store = db.transaction('produkte').objectStore('produkte');
const produkt = await promisify(store.get(id));
return produkt ?? null; // undefined = nicht gefunden
};
// Verwendung:
// const produkt = await ladeProdukt(db, 42);
// console.log(produkt?.name ?? 'Nicht vorhanden');
Ersten Datensatz in einem Schlüsselbereich lesen
const ersterAb = (db, minId) => {
const store = db.transaction('produkte').objectStore('produkte');
// Erster Datensatz mit id >= minId
const request = store.get(IDBKeyRange.lowerBound(minId));
request.onsuccess = () => {
console.log(request.result ? `Gefunden: ${request.result.name}` : 'Kein Treffer');
};
};
// ersterAb(db, 40);
// Wichtig · Fallstricke
- Nicht gefunden ≠ Fehler: Fehlt der Schlüssel, ist
resultundefined. Wurde ausdrücklichundefinedgespeichert (bei Stores ohnekeyPath), kannst du die Fälle nicht unterscheiden. Nutze danngetKey()odercount(). - Ausnahmen, die sofort (synchron) geworfen werden:
DataErrorbei ungültigem Schlüssel (z. B.null,undefined,NaN, Objekt),TransactionInactiveError, wenn die Transaktion schon beendet ist,InvalidStateError, wenn der Store gelöscht wurde. - Transaktions-Lebensdauer: Ein
awaitauf etwas anderes als IndexedDB-Anfragen (z. B.fetch) zwischen zwei Operationen lässt die Transaktion automatisch abschließen. Danach führen weitereget()-Aufrufe zuTransactionInactiveError. - Das Ergebnis ist eine Kopie. Änderungen daran werden erst mit
put()gespeichert. - Kompatibilität: in allen modernen Browsern und in Web Workern verfügbar. Im privaten Modus älterer Safari-/Firefox-Versionen war IndexedDB teilweise eingeschränkt.