概述
IndexedDB 是一个事务型数据库系统,类似于基于 SQL 的 RDBMS。 然而不同的是它使用固定列表,IndexedDB 是一个基于 JavaScript 的面向对象的数据库。
现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的大小不超过 4KB,且每次请求都会发送回服务器 LocalStorage 在 2.5MB 到 10MB 之间(各家浏览器不同),而且不提供搜索功能,不能建立自定义的索引。所以,需要一种新的解决方案,这就是 IndexedDB 诞生的背景
简单来说,IndexedDB 就是浏览器提供的本地数据库。
IndexedDB 具有以下特点
- 键值对储存
- 异步操作(避免锁死浏览器)
- 支持事务
- 同源限制(协议+域名+端口)
- 存储空间大
- 支持二进制存储(ArrayBuffer 对象和 Blob 对象,可存储文件数据)
基本概念
对比关系数据库 MySql 可以得到以下关系
- 数据库:IDBDatabase
- 表格:对象仓库(IDBObjectStore)
- 行数据:对象仓库存储的一条数据
- 索引:IDBindex,加速数据的检索(在对象仓库里面可为不同的键创建)
- 事务:IDBTransaction
- 操作请求:IDBRequest
- IDBCursor:遍历对象存储空间和索引
- IDBKeyRange:定义键的范围数据
基本操作
兼容性注意点
1 | // 全局变量兼容性问题 |
数据库操作
打开/新建数据库
1 | var databaseName = "MyTestDatabase"; |
window.indexedDB.open
函数打开对应的数据库,如果没有该数据库就会新建。
新建数据库
或者数据库版本
大于当前版本会触发onupgradeneeded
事件
数据库为什么会有版本?因为数据库的数据解构可能会发生改变的
,所以一般修改数据解构的操作在onupgradeneeded
里面书写
删除数据库
1 | window.indexedDB.deleteDatabase(databaseName); |
对象仓库操作(表格操作)
创建和修改表格是修改数据库的数据解构
,所以我把他们写在onupgradeneeded
事件里
创建表格
1 | request.onupgradeneeded = function(event) { |
删除表格
1 | request.onupgradeneeded = function(event) { |
数据操作(行数据操作)
新增数据(增)
1 | var databaseName = "MyTestDatabase"; |
删除数据(删)
1 | var databaseName = "MyTestDatabase"; |
修改数据(改)
1 | console.log("更新数据"); |
获取数据(查)
1 | console.log("读取数据"); |
通过指针对象遍历表格数据
1 | console.log("遍历数据"); |
小结
indexedDB的API还是非常多的,这里只是简单介绍了最常用的几个操作(个人认为^_^)。