Indexeddb 简明教程

IndexedDB - Searching

我们遇到许多情况,需要在对象存储中搜索值。对象存储在内部进行排序。可以通过以下方式完成:

  1. 根据键值或键范围进行搜索。

  2. 根据另一个对象字段进行搜索。

Searching by Key

我们可以通过对一个可接受的键范围使用 IDBKeyRange 对象,来搜索精确的键值或键值范围。IDBKeyRange 对象具有以下调用:

  1. IDBKeyRange.lowerBound(lower, [open]) for >=lower

  2. IDBKeyRange.upperBound(upper, [open]) for >=upper

  3. IDBKeyRange.bound(lower, upper, [lowerOpen] , [upperOpen]) 在 lower 和 upper 之间

  4. IDBKeyRange.only(key) 如果范围只包含一个键。

为了执行实际搜索,我们在对象存储上使用查询参数。用于执行这些操作的不同类型的函数是:

  1. store.get(query) - 根据键或范围搜索存储中的第一个值

  2. store.getAll([query],[count]) - 根据提到的计数限制搜索存储中的所有值。

  3. store.getKey(query) - 搜索第一个满足查询的键。

  4. store.getAllKeys([query],[count]) - 搜索所有满足查询的键,直到完成计数限制。

  5. store.count([query]) - 获取满足查询的键的总数。

Example

在此示例中,我们使用 getAll() 方法检索所有对象,并按其键来搜索对象:

class.get(‘student’)
class.getAll(IDBKeyRange.bound(‘science’,’math’)
class.getAll(IDBKeyRange.upperbound(‘science’,true)
class.getAll()
class.getAllKeys(IDBKeyRange.lowerbound(‘student’,true))

Searching by a field or index

为了根据其他对象字段进行搜索,我们需要使用索引。索引存储具有所需值的对象的键列表。索引在内部也像对象存储一样进行排序。

Syntax

objectStore.createIndex(name, keyPath, [options]);

name - 索引名称

keyPath - 将在对象字段的路径上进行搜索

options - 选项分为 2 类

  1. unique - 具有唯一值的对象存储中的对象将位于关键路径中,并且无法复制它们。

  2. multi−entry - 如果关键路径上的值为数组,则默认情况下,该索引将把整个数组视为键,但如果我们使用多条目,则该数组成员会变为索引键。

Example

如果我们想要根据价格搜索电话,则示例程序如下所示:

openRequest.onupgradeneeded = function() {
   let books = db.createObjectStore('phone', {keyPath: 'id'});
   let index = books.createIndex('pricephone', 'price');
};

要创建索引,我们需要使用升级项。

  1. 该索引将跟踪价格字段。

  2. 如果价格不是唯一的,我们无法设置 unique 选项。

  3. 如果价格不是数组,则 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>

Output

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