2017-12-15 4 views
0

Ich habe rund um die MDN zu lesen, aber ich stuff like:Was ist der Zweck von keyPath in IDBObjectStore.createIndex()?

keyPath
Der Schlüsselpfad für den Index zu verwenden. Beachten Sie, dass es möglich ist, einen Index mit einem leeren keyPath zu erstellen, und auch eine Sequenz (Array) als keyPath zu übergeben.

Nun, kein s @! T, keyPath ist ein Schlüsselpfad. Aber was ist das?

In allen examples, es ist dasselbe, wie der Name der Spalte (oder einen Index, wie sie es nennen):

objectStore.createIndex("hours", "hours", { unique: false }); 
    objectStore.createIndex("minutes", "minutes", { unique: false }); 
    objectStore.createIndex("day", "day", { unique: false }); 
    objectStore.createIndex("month", "month", { unique: false }); 
    objectStore.createIndex("year", "year", { unique: false }); 

They say, die Sie weitergeben können:

  • eine leere Zeichenfolge - ""
  • Eine gültige JavaScript-Kennung (ich nehme an, dies bedeutet gültige JS-Variablenname)
  • Mehrere Javascript getrennte Kennungen durch Zeiten, zB: "name.name2.foo.bar"
  • Ein Array eine der oben genannten, zB .: ["foo.bar","","name"]

Ich kann nicht vorstellen, enthält Welchem ​​Zweck diese dienen. Ich verstehe absolut nicht, was keyPath ist und wofür ich es verwenden kann. Kann jemand eine Beispielverwendung angeben, in der keyPath etwas anderes als der Name der Spalte ist? Eine Erklärung, welchen Einfluss die Werte von keyPath auf die Datenbank haben

Antwort

0

Ein Schlüsselpfad ist, wie Sie indexedDB angeben, welche Eigenschaften Ihres Objekts eine besondere Rolle spielen. Ähnlich wie Sie einer SQL-Datenbank anzeigen würden, dass eine bestimmte Spalte in einer Tabelle der Primärschlüssel der Tabelle ist oder wie Sie einer Datenbank mitteilen können, dass sie einen Index für eine oder mehrere bestimmte Spalten in einer Tabelle erstellen soll.

Mit anderen Worten, es ist der Pfad, den die indexedDB-Implementierung folgen sollte, wenn bestimmt wird, welche Eigenschaft für einige Berechnungen verwendet werden soll. Zum Beispiel, wenn nach einem Wert mit einem bestimmten Schlüssel gesucht wird.

Es ist ein Pfad und kein einfacher Schlüssel, da Objekteigenschaftenwerte auch Objekte sein können. Mit anderen Worten, es gibt eine Hierarchie. Zum Beispiel {a:{b:1}}. Der "Pfad" zum Wert 1 ist "a.b". Der Pfad ist die Reihenfolge der zu besuchenden Eigenschaften, um zu dem Wert zu gelangen.

Der Schlüsselteil des Namens bedeutet, dass die Spalten eine wichtige Rolle spielen. Zum Beispiel beim Identifizieren der Primärschlüsseleigenschaft oder einer bestimmten indizierten Eigenschaft.

Eigenschaften, die nicht Teil des Schlüsselpfads sind, werden in dem Sinne ignoriert, dass die indexedDB-Implementierung nur das gesamte Objekt als einen Sack von Eigenschaften behandelt und nur auf diese achtet oder auf diejenigen aufmerksam wird, die ein Teil davon sind ein Schlüsselpfad.

+0

Also ist es ein Serialisierungs-/Deserialisierungspfad, wenn ein Objekt als neue Zeile eingefügt wird? –

+0

Sorry, aber ich verstehe nicht, was Sie mit dem Serialisierungsweg meinen. – Josh

1

Beispiele könnten helfen. Wenn Sie einen Schlüsselpfad mit einem Objektspeicher verwenden, können Sie Schlüssel aus den gespeicherten Objekten auswählen, anstatt sie bei jedem put() - Aufruf angeben zu müssen.Zum Beispiel mit Datensätzen, die nur eine ID und Namen haben, können Sie den Datensatz des id als Primärschlüssel für den Objektspeicher verwenden:

store = db.createObjectStore('my_store', {keyPath: 'id'}); 
store.put({id: 987, name: 'Alice'}); 
store.put({id: 123, name: 'Bob'}); 

Welche Sie diesen Speicher gibt:

key | value 
------+------------------- 
123 | {id: 123, name: 'Bob'} 
987 | {id: 987, name: 'Alice'} 

Aber wenn Sie wollen Datensatz nach Namen suchen, können Sie einen Index zu erstellen:

name_index = store.createIndex('index_by_name', 'name'); 

Welche Sie diesen Index gibt:

key  | primary key | value 
--------+-------------+-------------------------- 
'Alice' | 987   | {id: 987, name: 'Alice'} 
'Bob' | 123   | {id: 123, name: 'Bob'} 

(Der Index speichert nicht wirklich eine Kopie des Werts, nur der Primärschlüssel. Aber es ist einfacher, sich dies vorzustellen. Dies erklärt auch die Eigenschaften, die Sie für einen Cursor sehen werden, wenn Sie über den Index iterieren)

So, jetzt mit Namen einen Datensatz nachschlagen kann mit:.

req = name_index.get('Alice') 

Wenn Datensätze werden in den Laden hinzugefügt Der Schlüsselpfad wird verwendet, um den Schlüssel für den Index zu generieren.

Schlüsselpfade mit . Separatoren können für Nachschlagevorgänge in komplexeren Datensätzen verwendet werden. Schlüsselpfade, die Arrays sind, können entweder zusammengesetzte Schlüssel erzeugen (wobei der Schlüssel selbst ein Array ist) oder mehrere Indexeinträge (wenn multiEntry: true angegeben ist)