aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/api/idbindex/index.html
blob: cb32afc0c0c868783394edd282b8a3af8d07ed37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
---
title: IDBIndex
slug: Web/API/IDBIndex
translation_of: Web/API/IDBIndex
---
<p>{{APIRef()}}</p>

<div class="summary">
<p><a href="/en/IndexedDB" title="en/IndexedDB">IndexedDB API</a> 中的IDBIndex接口提供了异步获取数据库中一个<a href="/en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss_index" title="en/IndexedDB/Basic_Concepts_Behind_IndexedDB#gloss_index">index</a>的功能。index是一种用于在另一个object store中查找记录的object store,其被称为被引用的object store。你可以通过使用该接口来取回数据。</p>
</div>

<p>你可以通过记录的键或使用一个index取回一个object store中的这些记录 (cursors 提供了第三种方式:请见 {{ domxref("IDBCursor") }})。一个index可以让你在object store的records中,通过使用records的properties(属性)来寻找records。</p>

<p>index是一个持久的键-值存储,其中其记录的值部分是被引用object store中的record的关键部分。在object store中新增、更新或是删除records时,索引中的records将自动填充。索引中的每条记录只能指向其引用的object  store中的唯一一条记录,但是多个索引可以引用同一个object store。当object store变更时,所有引用object store的索引都会自动更新。</p>

<p>索引中的records总是按照records的key进行排序。然而,不像object stores,一个给定的index可以包含具有相同key的多条记录。这些records将根据被引用object store中的主键进一步排序。</p>

<p>你可以设置在一个范围内的key,点击这里查看更多: {{domxref("IDBKeyRange")}}.</p>

<h2 id="Methods">Methods</h2>

<p>Inherits from: <a href="/en/DOM/EventTarget" title="en/DOM/EventTarget">EventTarget</a></p>

<dl>
 <dt>{{domxref("IDBIndex.count")}}</dt>
 <dd>Returns an {{domxref("IDBRequest")}} object, and in a separate thread, returns the number of records within a key range.</dd>
 <dt>{{domxref("IDBIndex.get")}}</dt>
 <dd>Returns an {{domxref("IDBRequest")}} object, and, in a separate thread, finds either the value in the referenced object store that corresponds to the given key or the first corresponding value, if <code>key</code> is a key range.</dd>
 <dt>{{domxref("IDBIndex.getAll")}} {{ Non-Standard_inline() }}</dt>
 <dd>Instantly retrieves all objects inside an {{domxref("IDBObjectStore")}}, setting them as the <code>result</code> of the request object.</dd>
 <dt>{{domxref("IDBIndex.getKey")}}</dt>
 <dd>Returns an {{domxref("IDBRequest")}} object, and, in a separate thread, finds either the given key or the primary key, if <code>key</code> is a key range.</dd>
 <dt>{{domxref("IDBIndex.getAllKeys")}} {{ Non-Standard_inline() }}</dt>
 <dd>Instantly retrieves the keys of all objects inside an {{domxref("IDBObjectStore")}}, setting them as the <code><a href="/en/IndexedDB/IDBRequest#attr_result" title="en/IndexedDB/IDBRequest#attr result">result</a></code> of the request object.</dd>
 <dt>{{domxref("IDBIndex.openCursor")}}</dt>
 <dd>Returns an {{domxref("IDBRequest")}} object, and, in a separate thread, creates a <a href="/en/IndexedDB#gloss_cursor" title="en/IndexedDB#gloss cursor">cursor</a> over the specified key range.</dd>
 <dt>{{domxref("IDBIndex.openKeyCursor")}} {{ Non-Standard_inline() }}</dt>
 <dd>Returns an {{domxref("IDBRequest")}} object, and, in a separate thread, creates a cursor over the specified key range, as arranged by this index.</dd>
</dl>

<h2 id="Properties">Properties</h2>

<dl>
 <dt>{{domxref("IDBIndex.name")}} {{readonlyInline}}</dt>
 <dd>index的名称。</dd>
 <dt>{{domxref("IDBIndex.objectStore")}} {{readonlyInline}}</dt>
 <dd>index所指向的object store的名称。</dd>
 <dt>{{domxref("IDBIndex.keyPath")}} {{readonlyInline}}</dt>
 <dd>此index的关键路径。它如果为null,则index不是自动填充的。</dd>
 <dt>{{domxref("IDBIndex.multiEntry")}} {{readonlyInline}}</dt>
 <dd>影响index的key路径的计算结果生成数组时索引的行为方式。如果为true,那么对于key数组中的每一项,索引中都有一条记录。如果为false,那么对于数组中的每个key都有一条记录。</dd>
 <dt>{{domxref("IDBIndex.unique")}} {{readonlyInline}}</dt>
 <dd>如果为true,这个index不会允许key有重复值。 </dd>
</dl>

<h2 id="Examples">Examples</h2>

<p>Opening a transaction then using <code>get()</code> to retrieve an object of known key:</p>

<pre class="brush: js;highlight:[18,21] notranslate">// Let us open our database
var request = window.indexedDB.open("toDoList", 4);

// these two event handlers act on the database being opened successfully, or not
request.onerror = function(event) {
  note.innerHTML += '&lt;li&gt;Error loading database.&lt;/li&gt;';
};

request.onsuccess = function(event) {
note.innerHTML += '&lt;li&gt;Database initialised.&lt;/li&gt;';

// store the result of opening the database in the db variable.
db = request.result;

// Open a transaction on the current database and get a reference to the object store
//that we want to pull information out of
var transaction = db.transaction(["toDoList"]);
var objectStore = transaction.objectStore("toDoList");

// Use get() to get a specific object from the object store, the key of which is "Walk dog"
var request = objectStore.get("Walk dog");
request.onerror = function(event) {
  console.log("There is no record stored for " + request.result.taskTitle);
};
request.onsuccess = function(event) {
  // Do something with the request.result!
  console.log("The deadline time for " + request.result.taskTitle + " is " +
              request.result.hours + ":" + request.result.minutes + ".";
};</pre>

<div class="note">
<p><strong>Note</strong>: need to work out a way to retrieve a series/range of objects using an index, or just all of them. Is this possible with get, or is this a job for cursor?</p>
</div>

<h2 id="Specifications">Specifications</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('IndexedDB', '#idl-def-IDBIndex', 'IDBIndex')}}</td>
   <td>{{Spec2('IndexedDB')}}</td>
   <td></td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility" name="Browser_compatibility">Browser compatibility</h2>

<p>{{ CompatibilityTable() }}</p>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari (WebKit)</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>12{{ property_prefix("-webkit") }}<br>
    23</td>
   <td>{{ CompatGeckoDesktop("2.0") }}</td>
   <td>10</td>
   <td>17</td>
   <td>{{ CompatNo() }}</td>
  </tr>
  <tr>
   <td><code>count()</code></td>
   <td>23</td>
   <td>{{ CompatGeckoDesktop("10.0") }}</td>
   <td>10</td>
   <td>17</td>
   <td>{{ CompatNo() }}</td>
  </tr>
  <tr>
   <td><code>getAll()</code> and <code>getAllKeys()</code></td>
   <td>{{ CompatNo() }}</td>
   <td>{{ CompatGeckoDesktop("24.0") }}<br>
    behind <code>dom.indexedDB.experimental</code>  pref</td>
   <td>{{ CompatNo() }}</td>
   <td>{{ CompatNo() }}</td>
   <td>{{ CompatNo() }}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>Firefox OS</th>
   <th>IE Phone</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>4.4</td>
   <td>{{ CompatGeckoMobile("2.0") }}</td>
   <td>1.0.1</td>
   <td>10</td>
   <td>17</td>
   <td>{{ CompatNo() }}</td>
  </tr>
  <tr>
   <td><code>count()</code></td>
   <td>4.4</td>
   <td>{{ CompatGeckoMobile("10.0") }}</td>
   <td>1.0.1</td>
   <td>10</td>
   <td>17</td>
   <td>{{ CompatNo() }}</td>
  </tr>
  <tr>
   <td><code>getAll()</code> and <code>getAllKeys()</code></td>
   <td>{{ CompatNo() }}</td>
   <td>{{ CompatGeckoDesktop("24.0") }}<br>
    behind <code>dom.indexedDB.experimental</code>  pref</td>
   <td>1.1 behind<br>
    <code>dom.indexedDB.experimental</code>  pref</td>
   <td>{{ CompatNo() }}</td>
   <td>{{ CompatNo() }}</td>
   <td>{{ CompatNo() }}</td>
  </tr>
 </tbody>
</table>
</div>

<div class="warning">
<p>Be careful in Chrome as it still implements the old specification along the new one. Similarly it still has the prefixed <code>webkitIndexedDB</code> property even if the unprefixed <code>indexedDB</code> is present.</p>
</div>

<h2 id="See_also">See also</h2>

<p>To learn more about various topics, see the following</p>

<ul>
 <li>Starting transactions: {{domxref("IDBDatabase")}}</li>
 <li>Setting transaction modes: {{domxref("IDBTransaction")}}</li>
 <li>Setting a range of keys: {{domxref("IDBKeyRange")}}</li>
 <li>The reference application for the examples in this reference: <a class="external" href="https://github.com/chrisdavidmills/to-do-notifications/tree/gh-pages">To-do Notifications</a> (<a class="external" href="http://chrisdavidmills.github.io/to-do-notifications/">view example live</a>.) Not every snippet appears in this example, but every example uses the same data structure and syntax, and they will make sense in the context of this example.</li>
</ul>