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是创建对象存储时的主要定义
最后一个参数的值可以是unique或multi-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