IndexedDB - 对象存储


对象存储是IndexedDB的数据存储。这是存储数据的地方。一个数据库可能有多个对象存储。将它们视为 RDBMS 中的表,我们根据要存储的数据类型来存储数据。

为了确保数据库完整性,只能使用回调函数idb.open()创建和删除对象存储。它包含一个名为createObjectStore()的方法,用于创建对象存储。

创建对象存储

您可以使用createObjectStore()方法创建对象存储。以下是该方法的语法 -

IDBDatabase.createObjectStore(name);
Or,
IDBDatabase.createObjectStore(name, options);

在哪里,

  • 名称是对象存储的名称。
  • options对象可以让我们定义各种配置属性。

例子

以下示例创建一个新数据库并在其中创建一个对象存储 -

<!DOCTYPE html>
<html lang="en">
<head>
   <title>Creating Object Store</title>
</head>
<body>
   <script>
      var request = indexedDB.open("myDatabase", 2);
      request.onupgradeneeded = event => {
         var db = event.target.result;
         var objectStore = db.createObjectStore("customers");
         document.write("Object store Created Successfully...");
      };
   </script>
</body>
</html>

输出

执行时,上述程序在浏览器上显示以下消息。

Object store Created Successfully...

确认

如果上面的程序执行成功,如果您展开“myDatabase”,您可以看到新创建的对象存储。

客户档案

定义主键

与 RDBMS 类似,我们需要主键来唯一定义对象存储中的某些数据。可以使用密钥路径或密钥生成器通过两种方式完成。

密钥路径和密钥生成器

键路径是始终存在并包含唯一值的属性。我们可以选择一个唯一的值,例如电子邮件地址。

生成器为添加到对象存储中的每个对象创建唯一值。默认情况下,如果我们不提及密钥生成器就会出现。例如,自动增量。

句法

以下是在对象存储上创建键路径的语法。

var objectStore = db.createObjectStore("ObjectStoreName", { keyPath: "primary key, autoincrement/autoDecrement : true" });

例子

在下面给出的示例中,我们使用 JavaScript 创建对象存储的键路径 -

<!DOCTYPE html>
<html lang="en">
<head>
   <title>keypath</title>
</head>
<body>
   <script>
      var request = indexedDB.open("myDtabase", 2);
      request.onupgradeneeded = event => {
         var db = event.target.result;
         var objectStore = db.createObjectStore("customers",{keyPath:"id", autoIncrement:true});
         document.write("Object store Created Successfully...");
      };
   </script>
</body>
</html>

输出

执行上面的示例时,它将在浏览器上显示以下文本 -

Object store Created Successfully...

确认

如果上面的程序执行成功,如果你展开“myDatabase”你可以看到新创建的对象存储,如果你点击它你可以观察到为“id”创建了keypath 。

关键路径

当创建新的对象存储时,它们会在 IndexedDB 文件夹中提及,如上所示。

您可以同时使用密钥路径和密钥生成器。如果数据始终是唯一的,我们可以使用键路径,否则如果值发生变化,您可以使用键生成器,如果您想更改每个值的值,但想要给出唯一代表存储的值,我们可以使用两者。

定义索引

索引是一种对象存储。它们用于从引用对象中检索由指定属性存储的数据。索引使用指定的属性作为其键路径,而不是引用存储的主键。

要创建索引,您需要在对象存储实例上调用createIndex()方法。

句法

以下是createIndex()方法的语法-

var myIDBIndex = objectStore.createIndex(indexName, keyPath);
var myIDBIndex = objectStore.createIndex(indexName, keyPath, Parameters);

在哪里,

  • indexName创建的索引的名称。

  • Keypath是创建对象存储时的主要定义

  • 最后一个参数的值可以是唯一的,也可以是多次的

    • 如果你“传递 unique: true”。索引不允许单个键出现重复值。

    • 如果你通过“multi-entry: true”。当 keyPath 解析为数组时,索引将为每个数组元素添加一个条目。如果为 false,它将添加一个包含数组的单个条目。

例子

以下 JavaScript 示例演示了如何创建索引。

<!DOCTYPE html>
<html lang="en">
<head>
   <title>OPENING A DATABASE</title>
</head>
<body>
   <script>
      const dbName = "myDB";
      const studentdata = [
         {name : "jason" , rollno: "160218737028" , branch : "IT"},
         {name : "lokesh" , rollno: "160218735020" , branch : "CSE"},
         {name : "tarun" , rollno: "160218733057" , branch : "EEE"},
         {name : "pranith" , rollno: "160218737029" , branch : "IT"}
      ];
      var request = indexedDB.open("myDB", 2);
      request.onupgradeneeded = event => {
         var db = event.target.result;
         var objectStore = db.createObjectStore("student",{ keyPath :"rollno" });
         objectStore.createIndex("name", "name", { unique: false });
         objectStore.createIndex("branch", "branch", { unique: false });
         objectStore.transaction.oncomplete = event => {
            var objectStore = db.transaction("student", "readwrite").objectStore("student");
            studentdata.forEach(function(student) {
               objectStore.add(student);
            });
         };
      };
   </script>
</body>
</html>

输出

如果您去验证 IndexedDB 数据库myDB的内容并展开它,您可以将创建的表观察为 -

关键价值观

如果单击姓名和学生值,您可以观察索引值:

名称索引

# 密钥(密钥路径:“名称”) 主键(键路径:“rollno”) 价值
0 “杰森” “160218737028”

{名称:'杰森',rollno:'160218737028',分支:

1. 分支:“IT”

2.姓名:“杰森”

3. 卷号: "160218737028"

1 “洛克什” “160218735020”

{名称:'lokesh',rollno:'160218735020',分支:'CSE'}

1. 分支:“CSE”

2.名称:“洛克什”

3. 卷号: "160218735020"

2 “普拉尼思” “160218737029”

{名称:'pranith',rollno:'160218737029',分支:'IT'}

1. 分支:“IT”

2.名称:“普拉尼思”

3. 卷号: "160218737029"

3 “塔伦” “160218733057”

{名称:'tarun',rollno:'160218733057',分支:'EEE'}

1. 分支:“EEE”

2.名称:“塔伦”

3. 卷号: "160218733057"

分行索引

# 键(键路径:“分支”) 主键(键路径:“rollno”) 价值
0 “CSE” “160218735020”

{名称:'lokesh',rollno:'160218735020',分支:'CSE'}

1. 分支:“CSE”

2.名称:“洛克什”

3. 卷号: "160218735020"

1 “EEE” “160218733057”

{名称:'tarun',rollno:'160218733057',分支:'EEE'}

1. 分支:“EEE”

2.名称:“塔伦”

3. 卷号: "160218733057"

2 “它” “160218737028”

{名称:'杰森',rollno:'160218737028',分支:'IT'}

1. 分支:“IT”

2.姓名:“杰森”

3. 卷号: "160218737028"

3 “它” “160218737029”

{名称:'pranith',rollno:'160218737029',分支:'IT'}

1. 分支:“IT”

2.名称:“普拉尼思”

3. 卷号: "160218737029"

删除对象存储

对象存储类似于数据库中的表,当不需要表时我们将其删除。同样,如果不再使用对象存储,您可以将其删除。要删除对象存储,您需要调用deleteObjectStore()函数。

句法

以下是deleteObjectStore()函数的语法-

db.deleteObjectStore("store_name");

其中,store_name 是您需要删除的对象存储的名称。

例子

让我们看一个 JavaScript 示例,该示例删除不再需要的对象存储 -

<!DOCTYPE html>
<html lang="en">
<head>
   <title>OPENING A DATABASE</title>
</head>
<body>
   <script>
      const dbName = "Database";
      var request = indexedDB.open("Database", 2);
      request.onupgradeneeded = event => {
         var db = event.target.result;
         var objectStore = db.createObjectStore("student",{ keyPath :"rollno" } );
         var objstore = db.createObjectStore("college",{autoIncrement : true});
         db.deleteObjectStore("college");
      };
   </script>
</body>
</html>

输出

在浏览器中删除 IndexedDB 文件夹中的对象存储之前和之后。

Database
   College − object store
   Student − object store
      Name − index
      Branch − index

Database
   Student − object store
      Name − index
      Branch − index