Indexeddb 简明教程
IndexedDB - Searching
我们遇到许多情况,需要在对象存储中搜索值。对象存储在内部进行排序。可以通过以下方式完成:
-
根据键值或键范围进行搜索。
-
根据另一个对象字段进行搜索。
Searching by Key
我们可以通过对一个可接受的键范围使用 IDBKeyRange 对象,来搜索精确的键值或键值范围。IDBKeyRange 对象具有以下调用:
-
IDBKeyRange.lowerBound(lower, [open]) for >=lower
-
IDBKeyRange.upperBound(upper, [open]) for >=upper
-
IDBKeyRange.bound(lower, upper, [lowerOpen] , [upperOpen]) 在 lower 和 upper 之间
-
IDBKeyRange.only(key) 如果范围只包含一个键。
为了执行实际搜索,我们在对象存储上使用查询参数。用于执行这些操作的不同类型的函数是:
-
store.get(query) - 根据键或范围搜索存储中的第一个值
-
store.getAll([query],[count]) - 根据提到的计数限制搜索存储中的所有值。
-
store.getKey(query) - 搜索第一个满足查询的键。
-
store.getAllKeys([query],[count]) - 搜索所有满足查询的键,直到完成计数限制。
-
store.count([query]) - 获取满足查询的键的总数。
Searching by a field or index
为了根据其他对象字段进行搜索,我们需要使用索引。索引存储具有所需值的对象的键列表。索引在内部也像对象存储一样进行排序。
Syntax
objectStore.createIndex(name, keyPath, [options]);
name - 索引名称
keyPath - 将在对象字段的路径上进行搜索
options - 选项分为 2 类
-
unique - 具有唯一值的对象存储中的对象将位于关键路径中,并且无法复制它们。
-
multi−entry - 如果关键路径上的值为数组,则默认情况下,该索引将把整个数组视为键,但如果我们使用多条目,则该数组成员会变为索引键。
Example
如果我们想要根据价格搜索电话,则示例程序如下所示:
openRequest.onupgradeneeded = function() {
let books = db.createObjectStore('phone', {keyPath: 'id'});
let index = books.createIndex('pricephone', 'price');
};
要创建索引,我们需要使用升级项。
-
该索引将跟踪价格字段。
-
如果价格不是唯一的,我们无法设置 unique 选项。
-
如果价格不是数组,则 multiEntry 不可应用。
Example
在以下示例中,我们创建一个事务,并使用 getAll() 函数检索所有对象。检索这些对象后,我们搜索该事务中的对象值。如果找到,则返回该对象;如果没有,则返回 false。
let transaction = db.transaction("phones");
let books = transaction.objectStore("phones");
let priceIndex = books.index("price_index");
let request = priceIndex.getAll(7);
request.onsuccess = function() {
if (request.result !== undefined) {
document.write("Phones", request.result);
} else {
document.write("There are no such phones");
}
};
HTML Example
搜索对象存储中值的 HTML 脚本实现如下:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<script>
const request = indexedDB.open("botdatabase",1);
request.onupgradeneeded = function(){
const db = request.result;
const store = db.createObjectStore("bots",{ keyPath: "id"});
store.createIndex("branch_db",["branch"],{unique: false});
}
request.onsuccess = function(){
document.write("database opened successfully");
const db = request.result;
const transaction=db.transaction("bots","readwrite");
const store = transaction.objectStore("bots");
const branchIndex = store.index("branch_db");
store.add({id: 1, name: "jason",branch: "IT"});
store.add({id: 2, name: "praneeth",branch: "CSE"});
store.add({id: 3, name: "palli",branch: "EEE"});
store.add({id: 4, name: "abdul",branch: "IT"});
store.put({id: 4, name: "deevana",branch: "CSE"});
const req = branchIndex.getAll(["CSE"]);
req.onsuccess = function(){
if(req.result!==undefined){
document.write("bots",req.result);
} else{
document.write("There are no such bots");
}
};
transaction.oncomplete = function(){
db.close;
}
}
</script>
</body>
</html>