2017-04-07 5 views
5

Ich versuche, eine wirklich einfache IndexedDB mit etwas JavaScript zu erstellen, aber es schlägt bereits im on-Handler fehl. Anscheinend ist der Browser (Chrome 57) nicht in der Lage, parse der keyPath (in Basic Concepts) meines Speichers.Ungültiger Schlüsselpfad in IndexedDB: Einschränkungen?

Ich folge mehr oder weniger diese einfachen Beispiele: MDN oder Opera-Dev.

Angenommen, ich möchte Objekte speichern wie diese in der DB:

{ 
    "1": 23, // the unique id 
    "2": 'Name', 
    "3": 'Description', 
    "4": null, 
    "5": null 
} 

Hier ist der Code:

var sStoreNodes = 'nodes'; 
var sIdFieldNode = '1'; // the important part 

// event is fired for creating the DB and upgrading the version 
request.onupgradeneeded = function(event) 
{ 
    var db = event.target.result; 

    // Create an objectStore for nodes. Unique key should be the id of the node, on property 1. 
    // So ID will be the key! 
    var objectStore = db.createObjectStore(
     sStoreNodes, 
     { 
      // changing to a plain string works, if it is a valid identifier and not just a strigified number 
      'keyPath'  : [ sIdFieldNode ], 
      'autoIncrement' : false // really important here 
     }); 
}; 

Die Fehlermeldung lautet wie:

Uncaught DOMException : Ausführen von 'createObjectStore' in 'IDBDatabase' fehlgeschlagen: Die keyPath-Option ist kein gültiger Schlüsselpfad. bei IDBOpenDBRequest.CCapIndexedDB.request.onupgradeneeded

Ich kann auch versuchen, den Schlüssel Weg zu verlassen, aber ich frage mich, warum dies geschieht und will, kann ich dagegen tun, wenn ich eine wirklich verwenden müssen (komplexer) Schlüsselpfad.

In Bezug auf die Spezifikation:

Ich bin nicht sicher, ob this hier angewandt werden kann:

Ein Wert gesagt wird ein gültiger Schlüssel sein, wenn sie eine der folgenden ECMAScript ist [ECMA -262] Typen: Primitive Zahlenwert, primärer String-Wert, Date-Objekt oder Array-Objekt.

und was this eigentlich bedeutet:

Wenn der Schlüsselpfad ein DOMString ist, wird der Wert [für den Schlüsselpfad bekommen] wird ein DOMString gleich dem Schlüsselpfad sein. Wenn der Schlüsselpfad eine Sequenz ist, ist der Wert ein neues Array, das durch Hinzufügen von Strings, die jeder DOMString in der Sequenz entsprechen, gefüllt wird.


bearbeiten Dies funktioniert, wenn Sie nicht über eine Zeichenfolgenummer verwenden, sondern eine Zeichenfolge statt, die ein gültiger Bezeichner ist (mit einem Zeichen beginnen [a-zA-Z]). Also 'keyPath' : 'b' ist OK. Ich denke, das liegt daran, dass dieser Wert zum Erstellen von Pfaden wie a.b.c verwendet wird.

Antwort

2

Here is the definition of a key path, from the spec:

Ein Schlüsselpfad ist ein DOMString oder eine Sequenz, die definiert, wie ein Schlüssel von einem Wert zu extrahieren. Ein gültiger Schlüsselpfad ist einer der folgenden:

  • Ein leerer DOMString.
  • Ein Bezeichner, bei dem es sich um einen DOMString handelt, der mit der IdentifierName-Produktion aus der ECMAScript-Sprachspezifikation [ECMA-262] übereinstimmt.
  • Ein DOMString bestehend aus zwei oder mehr durch Punkte getrennten Bezeichnern (ASCII-Zeichencode 46).
  • Eine nicht leere Sequenz, die nur DOMS-Strings enthält, die den obigen Anforderungen entsprechen.

Für eine Zeichenfolge eine ganze Zahl enthält, deutlich die ersten, dritten und vierten Optionen nicht gelten. Für die Sekunde müssen wir what an IdentifierName is sehen, was ein wenig kompliziert ist, aber im Grunde muss es mit einem Buchstaben, einem Unterstrich oder einem Dollarzeichen beginnen. Dies bedeutet, dass eine Zeichenfolge, die nur eine Ganzzahl enthält, kein gültiger Schlüsselpfad ist.

Wenn Sie wirklich ein Objekt haben, dessen Primärschlüssel in einem Feld ist, dessen Name eine Zeichenfolge mit einer Ganzzahl ist, können Sie das Feld umbenennen oder keine Schlüsselpfade verwenden (in diesem Fall müssen Sie den Schlüssel manuell angeben) als zweites Argument zu IDBObjectStore.add und IDBObjectStore.put).

Sie zu the definition for a key verknüpft, die die gültigen Werte definiert, die ein Schlüssel (wie für ein Objekt {a: 1} wo der Schlüsselpfad 'a' ist der Schlüssel 1 ist, die gültig ist) aufweisen kann.

Die other thing you linked to ist über Schlüsselpfade wie a.b.c Referenzieren {a: {b: {c: 1}}}.

Verwandte Themen