IDBIndex
========

L'interface **`IDBIndex`** de l'`API IndexedDB` est un accès à un index d'un magasins d'objet. Un index permet de trier les enregistrements d'un magasin d'objet sur une autre clé que la clé primaire.

Un index contient des enregistrements persistent. Chaque enregistrement est composé d'une clé ( la valeur du chemin de clé) et d'une valeur (la clé primaire de l'enregistrement dans le magasin d'objet). Les enregistrements de l'index se mettent automatiquement à jour lorsque un enregistrement du magasin d'objet est ajouté , mise à jour ou supprimé. Chaque enregistrement de l'index ne peut référer qu'a un enregistrement du magasin d'objet. Un magasin d'objet peut avoir plusieurs index et lorsque le magasin d'objet change tout les index sont mis à jour automatiquement.

On peut retrouver les enregistrement sur une partie des clés, voir `intervalle de clé`.

**Note:** Cette fonctionnalité est disponible via les Web Workers

Méthodes
--------

Hérite de: EventTarget

`IDBIndex.count()`

Fait un `requête` sur l'index. La requête compte le nombre d'enregistrements dans cet index ou sur l'`intervalle de clé` passé en paramètre.

`IDBIndex.get()`

Fait une `requête` pour renvoyer le premier enregistrement correspondant à la clé ou l'`IDBKeyRange` du magasin d'objet suivant l'index.

`IDBIndex.getKey()`

Fait une `requête` pour renvoyer la clé primaire correspondant à la clé ou à l'`intervalle de clé` de l'index. Si une clé est trouvé le résultat de la requête contiendra seulement la clé primaire de l'enregistrement et non l'enregistrement comme le fait `IDBIndex.get`.

`IDBIndex.getAll()`

Fait une `requête` qui renvoie un tableau ordonné suivant les clés, des clones structurés des enregistrements de l'`index relié`. On peut limité le nombre d'enregistrements en les filtrants suivant leurs clés ou en paramétrant le compteur.

`IDBIndex.getAllKeys()`

Ferrais une `requête` qui renverrait la liste de toutes les clés des enregistrements de l'index. On pourrait limiter le nombre d'enregistrements en les filtrants suivant leurs clés ou en paramétrant le compteur.

`IDBIndex.openCursor()`

Fait une `requête` récursive suivant un `curseur avec valeur` (en-US) qui itère l'index `relié` sur l'`intervalle de clé` spécifié.

`IDBIndex.openKeyCursor()`

Fait une `requête` récursive suivant un `curseur` qui itère l'index `relié` sur l'`intervalle de clé` spécifié.

Propriétés
----------

`IDBIndex.isAutoLocale` Lecture seule  
Non-standard

Renvoie un `booléen` (en-US) indiquant si la valeur de `locale` à été paramétré sur `auto` lors de la mise en place de l'index (voir les paramètres ``IDBObjectStore.createIndex``).

`IDBIndex.locale` Lecture seule  
Non-standard

Renvoie la localisation de l'index (par exemple fr, ou `en-US`) `si la localisation à été spécifie lors de la mise en place de l'index` (voir les paramètres `IDBObjectStore.createIndex`).

`IDBIndex.name` Lecture seule 

Renvoie le nom de l'index.

`IDBIndex.objectStore` Lecture seule 

Renvoie un `accès au magasin d'objet` que référence l'index.

`IDBIndex.keyPath` Lecture seule 

Renvoie le chemin de clé de l'index. Si l'index n'est pas automatiquement mise à jour la propriété vaux `null`.

`IDBIndex.multiEntry` Lecture seule 

Renvoie un `booléen` (en-US) qui indique comment l'index gère le chemin de clé si c'est un tableau.

`IDBIndex.unique` Lecture seule 

Renvoie un `booléen` (en-US) qui indique l'index interdit la duplication d'enregistrement sur sa clé.

Exemple
-------

Dans l'exemple suivant on ouvre une transaction puis un magasin d'objet et enfin l'index `lName`.

Finalement, On itère sur tous les enregistrements pour en insérer les données dans un tableau HTML. En utilisant la méthode `IDBIndex.openCursor` qui travaille de la même façon que la méthode `IDBObjectStore.openCursor` de l'`accès` au magasin d'objet sauf que les enregistrements sont renvoyés dans l'ordre de l'index et non celui du magasin d'objet.


```js
function displayDataByIndex() {
  tableEntry.innerHTML = "";

  //ouvre un transaction
  var transaction = db.transaction(["contactsList"], "readonly");
  //accés au magasin d'objet
  var objectStore = transaction.objectStore("contactsList");

  //on récupère l'index
  var myIndex = objectStore.index("lName");

  //un curseur qui itère sur l'index
  var request = myIndex.openCursor();
  request.onsuccess = function (event) {
    var cursor = request.result;
    if (cursor) {
      var tableRow = document.createElement("tr");
      tableRow.innerHTML =
        "<td>" +
        cursor.value.id +
        "</td>" +
        "<td>" +
        cursor.value.lName +
        "</td>" +
        "<td>" +
        cursor.value.fName +
        "</td>" +
        "<td>" +
        cursor.value.jTitle +
        "</td>" +
        "<td>" +
        cursor.value.company +
        "</td>" +
        "<td>" +
        cursor.value.eMail +
        "</td>" +
        "<td>" +
        cursor.value.phone +
        "</td>" +
        "<td>" +
        cursor.value.age +
        "</td>";
      tableEntry.appendChild(tableRow);

      cursor.continue();
    } else {
      console.log("Tous les enregistrements ont été affichés.");
    }
  };
}
```


**Note :** Pour un exemple de travail complet, voir notre To-do Notifications app (view example live).

Spécifications
--------------

| Specification |
| --- |
| Indexed Database API 3.0 # index-interface |

Compatibilité des navigateurs
-----------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Voir aussi
----------

* `Utiliser IndexedDB`
* `Débuter une connexion`
* `Utilisé les transactions`
* `Définir l'intervalle des clés`
* `Accès aux magasins d'objets`
* `Utiliser les curseur`
* Exemple de référence: To-do Notifications (voir l'exemple en direct.)