openCursor()方法实际上可以接收两个参数,第一个是IDBKeyRange 的实例,第二个是表示方
向的字符串。通常,游标都是从对象存储的第一条记录开始,每次调用continue()或advance()都
会向最后一条记录前进。这样的游标其默认方向为"next"。如果对象存储中有重复的记录,可能需要
游标跳过那些重复的项。为此,可以给openCursor()的第二个参数传入"nextunique":
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
request = store.openCursor(null, “nextunique”);
注意,openCursor()的第一个参数是null,表示默认的键范围是所有值。此游标会遍历对象存
储中的记录,从第一条记录开始迭代,到最后一条记录,但会跳过重复的记录。
另外,也可以创建在对象存储中反向移动的游标,从最后一项开始向第一项移动。此时需要给
openCursor()传入"prev"或"prevunique"作为第二个参数(后者的意思当然是避免重复)。例如:
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
request = store.openCursor(null, “prevunique”);
在使用"prev"或"prevunique"打开游标时,每次调用continue()或advance()都会在对象存
储中反向移动游标。
索引
对某些数据集,可能需要为对象存储指定多个键。例如,如果同时记录了用户ID 和用户名,那可能
需要通过任何一种方式来获取用户数据。为此,可以考虑将用户ID 作为主键,然后在用户名上创建索引。
要创建新索引,首先要取得对象存储的引用,然后像下面的例子一样调用createIndex():
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
index = store.createIndex(“username”, “username”, { unique: true });
createIndex()的第一个参数是索引的名称,第二个参数是索引属性的名称,第三个参数是包含
键unique 的options 对象。这个选项中的unique 应该必须指定,表示这个键是否在所有记录中唯
一。因为username 可能不会重复,所以这个键是唯一的。
createIndex()返回的是IDBIndex 实例。在对象存储上调用index()方法也可以得到同一个实
例。例如,要使用一个已存在的名为"username"的索引,可以像下面这样:
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
index = store.index(“username”);
索引非常像对象存储。可以在索引上使用openCursor()方法创建新游标,这个游标与在对象存储
上调用openCursor()创建的游标完全一样。只是其result.key 属性中保存的是索引键,而不是主
键。下面看一个例子:
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
index = store.index(“username”),
request = index.openCursor();
request.onsuccess = (event) => {
// 处理成功
};
使用openKeyCursor()方法也可以在索引上创建特殊游标,只返回每条记录的主键。这个方法接收的
参数与openCursor()一样。最大的不同在于,event.result.key 是索引键,且event.result.value
是主键而不是整个记录。
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
index = store.index(“username”),
request = index.openKeyCursor();
request.onsuccess = (event) => {
// 处理成功
// event.result.key 是索引键,event.result.value 是主键
};
可以使用get()方法并传入索引键通过索引取得单条记录,这会创建一个新请求:
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
index = store.index(“username”),
request = index.get(“007”);
request.onsuccess = (event) => {
// 处理成功
};
request.onerror = (event) => {
// 处理错误
};
如果想只取得给定索引键的主键,可以使用getKey()方法。这样也会创建一个新请求,但
result.value 等于主键而不是整个记录:
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
index = store.index(“username”),
request = index.getKey(“007”);
request.onsuccess = (event) => {
// 处理成功
// event.target.result.key 是索引键,event.target.result.value 是主键
};
在这个onsuccess 事件处理程序中,event.target.result.value 中应该是用户ID。
任何时候,都可以使用IDBIndex 对象的下列属性取得索引的相关信息。
name:索引的名称。
keyPath:调用createIndex()时传入的属性路径。
objectStore:索引对应的对象存储。
unique:表示索引键是否唯一的布尔值。
对象存储自身也有一个indexNames 属性,保存着与之相关索引的名称。使用如下代码可以方便地
了解对象存储上已存在哪些索引:
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
indexNames = store.indexNames
for (let indexName in indexNames) {
const index = store.index(indexName);
console.log(Index name: ${index.name} KeyPath: ${index.keyPath} Unique: ${index.unique}
);
}
以上代码迭代了每个索引并在控制台中输出了它们的信息。
在对象存储上调用deleteIndex()方法并传入索引的名称可以删除索引:
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
store.deleteIndex(“username”);
因为删除索引不会影响对象存储中的数据,所以这个操作没有回调。
03-29
379
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-04
7159
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)