IndexedDB
是一种可让你在用户浏览器中持久存储数据的方法,对于须要存储大量数据或者离线的web应用均可以考虑使用,相比已经被废弃的WebSQL
,目前来看是IndexedDB将来一种的趋势,而且兼容性比较友好(见下图),若是储存有限的localStorage
(具体大小看各家浏览器支持),不能知足你当前的使用需求,能够考虑使用IndexedDB。
IndexedDB的存储空间取决于硬盘大小和浏览器限制规则,正常状况必定会远远大于localStorage的广泛5M。
另外IndexedDB也听从同源协议
(same-origin policy),只能访问同域中存储的数据。web
*数据来源于 caniuse数据库
索引(indexes)
、表(tables)
、指针(cursors)
这些都必须依赖于事物,另外事物自己具备生存周期,只能在生存周期内使用,而且事物只能自动提交,不能够手动操做。indexedDB.open( databaseName, version
)
databaseName: 数据库的名字,若是当前数据库不存在则就会新建,若存在就是打开。
version: 数据库的版本,可省略,若省略,新增时默认为1,打开时默认为当前版本。
如今建立一个新的数据库浏览器
window.indexedDB.open('firstDB')
indexedDB.open()会返回一个IDBRequest对象( IDBRequest
对象表示打开的数据库链接,使用open()
和deleteDatabase()
都会返回这个对象,对于数据库的操做都是基于这个对象 )
在执行open操做后咱们须要关注IDBRequest
对象的三个事件,success
打开数据库成功、upgradeneeded
数据库升级(当前指定的版本大于实际版本)、error
打开数据库失败。异步
const dbName = "firstDB" let messageList = [], request, db request = window.indexedDB.open(dbName, 1) request.onerror = function(event) { //错误处理 console.error('数据库异常') } request.onsuccess = function(event) { //成功 db = request.result //获取数据库对象 } request.onupgradeneeded = function(event) { //版本变动 db = event.target.result //更新数据库对象 }
在数据库第一次建立的时候,version经历了从无到有的变动,因此会触发onupgradeneeded事件.
须要关注点 1.keyPath主动设置主键,2.createIndex建立索引。函数
const dbName = "firstDB" let messageList = [], request, db (function() { 'use strict' if (!('indexedDB' in window)) { //检查当前浏览器是否支持indexedDB alert("Your browser doesn't support a stable version of IndexedDB.") return } request = window.indexedDB.open(dbName, 1) })() request.onerror = function(event) { //错误处理 console.error('数据库异常') } request.onsuccess = function(event) { //成功 db = request.result //获取数据库对象 } request.onupgradeneeded = function(event) { //版本变动 db = event.target.result //更新数据库对象 let objectStore if(!db.objectStoreNames.contains('message')) { //检查是否存在message //不存在则建立message keyPath主动设置主键 { keyPath: 'id' } autoIncrement自动生成主键 //新建索引 参数分别为索引名称、索引所在的属性、配置对象 unique是否容许重复值 objectStore = db.createObjectStore('message',{ autoIncrement: true } ) objectStore.createIndex('time', 'time', { unique: true }) objectStore.createIndex('content', 'content', { unique: false }) } }
插入
须要关注点 建立事物 transaction() 第一个参数 涉及操做的objectStore
第二个参数 操做类型 可省略 默认只读 readonly只读 readwrite读写spa
function writeData(params) { //建立事物 第一个参数 涉及的objectStore //第二个参数 操做类型 可省略 默认只读 readonly只读 readwrite读写 let req = db .transaction(['message'], 'readwrite') .objectStore('message') .add(params) req.onsuccess = function (event) { console.info('写入成功') } req.onerror = function (event) { console.error('写入失败: ' + event.srcElement.error.message ) } }
读取、查找指针
function readData() { let transaction = db.transaction(['message']), objectStore = transaction.objectStore('message'), req = objectStore.get(1) req.onsuccess = function() { if(req.result) { //读取成功 console.log(req.result) } } req.onerror = function() { console.error('读取失败') } } function findData(key, value) { let transaction = db.transaction(['message'], 'readonly'), store = transaction.objectStore('message'), index = store.index(key), //对应的key req = index.get(value) //对应查找的值 req.onsuccess = function(event) { //操做成功 let result = event.target.result if(result) { //存在结果 console.log(result) } } }
遍历数据、获取所有数据code
function traversalData() { let objectStore = db.transaction('message').objectStore('message') // openCursor(range, direction) range 对象来限制被检索的项目的范围, direction能够指定你但愿进行迭代的方向 objectStore.openCursor().onsuccess = function(event) { let cursor = event.target.result if(cursor) { messageList.push(cursor.value) cursor.continue() //继续执行 } else { console.info('获取完毕') } } } function readAllData() { //一次性获取所有数据 let objectStore = db.transaction('message').objectStore('message'), allRecords = objectStore.getAll() allRecords.onsuccess = function() { messageList = allRecords.result } }
更新、删除对象
function updateData(params) { let req = db .transaction(['message'], 'readwrite') .objectStore('message') .put(params) req.onsuccess = function(event) { // 数据已更新 } req.onerror = function(event) { // 错误处理 } } function deleteData(key) { let req = db .transaction(['message'], 'readwrite') .objectStore('message') .delete(key) req.onsuccess = function(event) { console.info('数据删除成功') } }
IDBRequest对象属性
是由IDBRequest接口返回的事件处理函数的访问结果集,结果集来自对数据库和数据库对象发起的异步查询。咱们全部对IndexedDB数据库的读写操做所有都要经过request的方式来实现。request对象初始时不包括任何关于操做结果的信息,当request上的事件触发时,能够经过IDBRequest实例上的事件处理函数访问相关信息。IDBCursor
接口返回一个游标,可以用于遍历数据库中的记录。游标包含一个源,指向须要遍历的索引或者对象存储区。它在所属区间范围内有一个位置,能够根据记录key的顺序递增或递减方向移动。游标使应用程序可以异步处理在游标范围内的全部记录,同时容许在同一时间拥有无数个游标。blog
由于数据存在用户本地,当发生用户主动去清除数据,浏览器处于隐私模式退出,用户硬盘容量到达上限,硬盘文件发生损坏等状况下使用都会受影响。