- IndexedDB 教程
- IndexedDB - 首页
- IndexedDB - 简介
- IndexedDB - 安装
- IndexedDB - 连接
- IndexedDB - 对象存储
- IndexedDB - 创建数据
- IndexedDB - 读取数据
- IndexedDB - 更新数据
- IndexedDB - 删除数据
- 使用 getAll() 函数
- IndexedDB - 索引
- IndexedDB - 范围
- IndexedDB - 事务
- IndexedDB - 错误处理
- IndexedDB - 搜索
- IndexedDB - 游标
- IndexedDB - Promise 包装器
- IndexedDB - ECMAScript 绑定
- IndexedDB 有用资源
- IndexedDB - 快速指南
- IndexedDB - 有用资源
- IndexedDB - 讨论
IndexedDB - 搜索
我们会遇到许多需要在对象存储中搜索值的场景。对象存储在内部已排序。可以通过以下方式进行:
- 按键值或键范围搜索。
- 基于其他对象字段搜索。
按键搜索
我们可以使用 IDBKeyRange 对象和可接受的键范围来搜索精确的键值或键值范围。IDBKeyRange 对象具有以下调用:
IDBKeyRange.lowerBound(lower, [open]) 用于 >= lower
IDBKeyRange.upperBound(upper, [open]) 用于 <= 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]) − 获取满足查询的键的总数。
示例
在这个示例中,我们使用 getAll() 方法检索所有对象,并按其键搜索对象:
class.get(‘student’) class.getAll(IDBKeyRange.bound(‘science’,’math’) class.getAll(IDBKeyRange.upperbound(‘science’,true) class.getAll() class.getAllKeys(IDBKeyRange.lowerbound(‘student’,true))
按字段或索引搜索
要根据其他对象字段进行搜索,我们需要使用索引。索引存储具有所需值的对象的键列表。索引也像对象存储一样在内部排序。
语法
objectStore.createIndex(name, keyPath, [options]);
name − 索引名称
keyPath − 搜索将在对象字段的路径上进行
options − 选项有两种类型
unique − 存储中具有唯一值的将在键路径上存在对象,并且不能创建它们的副本。
multiEntry − 如果键路径上的值是数组,则默认情况下,索引会将整个数组视为一个键,但如果我们使用 multiEntry,则数组成员将成为索引键。
示例
如果我们想根据价格搜索手机,示例程序如下:
openRequest.onupgradeneeded = function() { let books = db.createObjectStore('phone', {keyPath: 'id'}); let index = books.createIndex('pricephone', 'price'); };
要创建索引,我们需要使用升级。
- 索引将跟踪价格字段。
- 如果价格不唯一,则不能设置 unique 选项。
- 如果价格不是数组,则 multiEntry 不适用。
示例
在以下示例中,我们创建一个事务并使用 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 示例
下面给出了在对象存储中搜索值的 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>
输出
database opened successfully bots (2) [{...}, {...}] arg1:(2) [{...}, {...}] 0:{id: 2, name: 'praneeth', branch: 'CSE'} 1:{id: 4, name: 'deevana', branch: 'CSE'} length:2 [[Prototype]]:Array(0) [[Prototype]]:Object