Überprüfen Sie, ob IndexedDB objectStore bereits einen Schlüssel enthält

7

Das Hinzufügen eines Objekts zu einem IndexedDB-Objektspeicher schlägt fehl, wenn der Schlüssel bereits vorhanden ist. Wie kann ich die Existenz eines Objekts mit einem bestimmten Schlüssel überprüfen - vorzugsweise synchron (kein Grund für eine andere Ebene von Callbacks) und ohne das Objekt zu ziehen.

Ich weiß, wie man Anfragen asynchron über Transaktionen erledigen kann, aber es scheint ein bisschen eine Qual zu sein jedes Mal, wenn ich ein Objekt hinzufügen möchte.

note Lösung muss nur in Chrome funktionieren (wenn das hilft)

    
Chris 09.03.2013, 02:54
quelle

4 Antworten

6

Bis jetzt hat keiner der Browser die Sync-API implementiert, also musst du es async machen. Ein objectStore macht eine get -Methode verfügbar, die Sie mit einem Schlüssel versehen, und gibt Ihnen das Objekt (oder null) zurück, das mit dem Schlüssel übereinstimmt.

Es gibt ein wirklich gutes Tutorial zu MDN, das die Verwendung von IDB behandelt, und einen Datensatz erhalten ist auch abgedeckt, aber der inline Code ist:

%Vor%

Wenn Sie den Datensatz nicht abrufen möchten, können Sie immer die Methode count für einen Index verwenden, wie in hier in der Spezifikation . Auf der Grundlage des Ergebnisses davon können Sie entweder add oder put verwenden, um den Datensatz zu modifizieren. Dadurch wird das Extrahieren des Datensatzes erspart, wenn dies nicht erforderlich ist.

    
Aaron Powell 10.03.2013, 23:47
quelle
10

Der beste Weg, die Existenz eines Schlüssels zu überprüfen, ist objectStore.count (key). Welches ist asynchron?

In Ihrem Fall ist die beste Option openCursor Ihres Schlüssels. Wenn vorhanden, wird der Cursor angezeigt.

%Vor%     
Kyaw Tun 10.03.2013 00:55
quelle
3

Ein bisschen spät für eine Antwort, aber möglich, es hilft anderen. Ich stolperte immer noch - wie ich vermute - über das gleiche Problem, aber es ist sehr einfach:

Wenn Sie Datensätze EINFÜGEN oder AKTUALISIEREN möchten, verwenden Sie objectStore.put(object) (Hilfe)
Wenn Sie nur Datensätze einfügen möchten, verwenden Sie objectStore.add(object) (Hilfe)

Wenn Sie also add(object) verwenden und ein Datensatzschlüssel in der Datenbank noch vorhanden ist, wird er nicht überschrieben und löst den Fehler 0 "ConstraintError: Schlüssel ist bereits im Objektspeicher vorhanden" aus Wenn Sie put(object) verwenden, wird es überschrieben.

    
Lutz 24.04.2016 09:28
quelle
1

Die Frage ist, warum willst du das wissen? Vielleicht sollten Sie einen anderen Ansatz verwenden?

Sie können das automatische Inkrement verwenden, damit Sie nicht prüfen müssen, ob ein Schlüssel existiert, Sie erhalten immer einen eindeutigen Schlüssel.

Sie können auch die put-Methode anstelle der add-Methode verwenden. Mit dem Put werden die Daten aktualisiert, wenn der Schlüssel existiert und wenn der Schlüssel nicht existiert, werden die Daten hinzugefügt.

Alles hängt davon ab, warum Sie überprüfen wollen, ob etwas existiert.

    
Kristof Degrave 11.03.2013 09:31
quelle

Tags und Links