- 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 - 对象存储
对象存储是 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 类似,我们需要主键来唯一地定义对象存储中的某些数据。这可以通过使用键路径或键生成器两种方式完成。
键路径和键生成器
键路径是一个始终存在且包含唯一值的属性。例如,我们可以选择一个唯一值,例如电子邮件地址。
键生成器为添加到对象存储的每个对象创建一个唯一值。默认情况下,如果我们不提及,键生成器就会出现。例如,自动递增。
语法
以下是创建对象存储键路径的语法。
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”创建了键路径。
创建新的对象存储时,它们会像上面那样显示在 IndexedDB 文件夹中。
您可以同时使用键路径和键生成器。如果数据始终唯一,我们可以使用键路径;如果值发生变化,可以使用键生成器;如果要为每个值更改值,但又想提供唯一表示存储的值,则可以使用两者。
定义索引
索引是一种对象存储。它们用于从由指定属性存储的引用对象中检索数据。索引使用指定的属性作为其键路径,而不是引用存储的主键。
要创建索引,需要在对象存储实例上调用createIndex()方法。
语法
以下是createIndex()方法的语法:
var myIDBIndex = objectStore.createIndex(indexName, keyPath); var myIDBIndex = objectStore.createIndex(indexName, keyPath, Parameters);
其中,
indexName 是创建的索引的名称。
Keypath 是创建对象存储时的主要定义
最后一个参数的值可以是unique 或 multi-entry
如果您“传递 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”) | 主键(键路径:“rollno”) | 值 |
---|---|---|---|
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”) | 主键(键路径:“rollno”) | 值 |
---|---|---|---|
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