IndexedDB - 对象存储

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

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

创建对象存储

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

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

这里,

  • name 是对象存储的名称。
  • 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 类似,我们需要主键来唯一定义对象存储中的某些数据。 它可以通过使用keyPath或密钥生成器的两种方式来完成。

keyPath和密钥生成器

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

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

语法

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

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

示例

在下面给出的示例中,我们使用 JavaScript 创建对象存储的keyPath −

<!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" 创建了键路径。

关键路径

当创建新的对象存储时,它们会在上面的 IndexedDB 文件夹中提到。

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

定义索引

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

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

语法

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

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

这里,

  • indexName 是创建的索引的名称。

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

  • 最后一个参数的值可以是uniquemulti-entry

    • 如果您"pass 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 的内容并展开它,您可以观察到创建的表为 −

键值

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

Name 名称索引

# Key(Key path:"name") Primary key (Key path:"rollno") Value
0 "jason" "160218737028"

{name: 'jason', rollno: '160218737028', branch:

1. branch: "IT"

2. name: "jason"

3. rollno: "160218737028"

1 "lokesh" "160218735020"

{name: 'lokesh', rollno: '160218735020', branch: 'CSE'}

1. branch: "CSE"

2. name: "lokesh"

3. rollno: "160218735020"

2 "pranith" "160218737029"

{name: 'pranith', rollno: '160218737029', branch: 'IT'}

1. branch: "IT"

2. name: "pranith"

3. rollno: "160218737029"

3 "tarun" "160218733057"

{name: 'tarun', rollno: '160218733057', branch: 'EEE'}

1. branch: "EEE"

2. name: "tarun"

3. rollno: "160218733057"

Branch Index

# Key(Key path:"branch") Primary key (Key path:"rollno") Value
0 "CSE" "160218735020"

{name:'lokesh', rollno:'160218735020', branch: 'CSE'}

1. branch: "CSE"

2. name: "lokesh"

3. rollno: "160218735020"

1 "EEE" "160218733057"

{name:'tarun', rollno: '160218733057', branch: 'EEE'}

1. branch: "EEE"

2. name: "tarun"

3. rollno: "160218733057"

2 "IT" "160218737028"

{name:'jason', rollno: '160218737028', branch: 'IT'}

1. branch: "IT"

2. name: "jason"

3. rollno: "160218737028"

3 "IT" "160218737029"

{name:'pranith', rollno: '160218737029', branch: 'IT'}

1. branch: "IT"

2. name: "pranith"

3. rollno: "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