IndexedDB介绍
概念
IndexedDB是浏览器提供的本地数据库, 它可以被网页脚本创建和操作
特点
- 键值对存储。 所有的数据都可以存储, 每一个数据都有主键, 主键是唯一的、不会重复
- 异步。 IndexedDB操作不会锁死浏览器,用户依然可以进行其他操作; 和localstorage对比, 后者是同步的
- 支持事务。 意味一系列操作之中, 只要有一步失败, 整个事务就会取消, 数据库回滚到之前的状态, 不存在只改写一部分数据
- 同源策略。 受同源策略限制, 每一个数据库都有对应创建它的域名, 网页只能访问自身域名下数据库
IndexedDB基本概念
- 数据库 – IDBDatabase 对象。 每个域名(严格的说,是协议 + 域名 + 端口)都可以新建任意多个数据库;同一个时刻,只能有一个版本的数据库存在。如果要修改数据库结构(新增或删除表、索引或者主键),只能通过升级数据库版本完成
- 对象仓库 – IDBObjectStore 对象。每个数据库包含若干个对象仓库(object store)。它类似于关系型数据库的表
- 索引 – IDBIndex 对象
- 事务 – IDBTransaction 对象
- 操作请求 – IDBRequest 对象
- 指针 – IDBCursor 对象
- 主键集合 – IDBKeyRange 对象
操作流程
1. 打开数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var request = window.indexedDB.open(databaseName, version);
request.onerror = function (event) { console.log('数据库打开报错'); };
request.onsuccess = function (event) { db = request.result; console.log('数据库打开成功'); };
request.onupgradeneeded = function (event) { db = event.target.result; };
|
2. 新建数据库
1 2 3 4 5 6 7
| request.onupgradeneeded = function (event) { db = event.target.result; var objectStore; if (!db.objectStoreNames.contains('person')) { objectStore = db.createObjectStore('person', { keyPath: 'id' }); } }
|
3. 新增数据
新增数据指的是向对象仓库写入数据记录。这需要通过事务完成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| function add() { var request = db.transaction(['person'], 'readwrite') .objectStore('person') .add({ id: 1, name: '张三', age: 24, email: 'zhangsan@example.com' });
request.onsuccess = function (event) { console.log('数据写入成功'); };
request.onerror = function (event) { console.log('数据写入失败'); } }
add()
|
4. 读取数据
读取数据也是通过事务完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function read() { var transaction = db.transaction(['person']); var objectStore = transaction.objectStore('person'); var request = objectStore.get(1);
request.onerror = function(event) { console.log('事务失败'); };
request.onsuccess = function( event) { if (request.result) { console.log('Name: ' + request.result.name); console.log('Age: ' + request.result.age); console.log('Email: ' + request.result.email); } else { console.log('未获得数据记录'); } }; }
read();
|
5. 遍历数据
遍历数据表格的所有记录,要使用指针对象 IDBCursor。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function readAll() { var objectStore = db.transaction('person').objectStore('person');
objectStore.openCursor().onsuccess = function (event) { var cursor = event.target.result;
if (cursor) { console.log('Id: ' + cursor.key); console.log('Name: ' + cursor.value.name); console.log('Age: ' + cursor.value.age); console.log('Email: ' + cursor.value.email); cursor.continue(); } else { console.log('没有更多数据了!'); } }; }
readAll()
|
6. 更新数据
更新数据要使用IDBObject.put()方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| function update() { var request = db.transaction(['person'], 'readwrite') .objectStore('person') .put({ id: 1, name: '李四', age: 35, email: 'lisi@example.com' });
request.onsuccess = function (event) { console.log('数据更新成功'); };
request.onerror = function (event) { console.log('数据更新失败'); } }
update();
|
7. 删除数据
IDBObjectStore.delete()方法用于删除记录。
1 2 3 4 5 6 7 8 9 10 11
| function remove() { var request = db.transaction(['person'], 'readwrite') .objectStore('person') .delete(1);
request.onsuccess = function (event) { console.log('数据删除成功'); }; }
remove();
|
[文章来源](https://www.ruanyifeng.com/blog/2018/07/indexeddb.html)