1、是什么
浏览器端可用的永久缓存数据库。提供可存储大量结构化数据(包含blobs与file)的底层API,该API使用索引对数据库实现高性能的搜索。
2、特点
- 是一个事务型数据库
- 是一个基于js的面象对象的数据库
- 允许您存储和检索用键索引的对象、存储结构化克隆算法支持的任何对象;
- 同源可操作
- IndexDB执行操作是异步的
3、如何连接数据库
- 数据库的访问:IDBFactory
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
var request = window.indexedDB.open("toDoListDB", 4);- 打开数据库连接:open(数据库名,版本)
- 删除数据库:deleteDatabase()
- 指大小比较:cmp(a, b)
- 打开数据库:IDBOpenDBRequest当你创建一个新的数据库或者增加已存在的数据库的版本号触发
- request.onupgradeneeded // 是我们唯一可以修改数据库结构的地方。在这里面,我们可以创建和删除对象存储空间以及构建和删除索引。
request.onupgradeneeded = function(event) { var db = event.target.result; var objectStore = db.createObjectStore('toDoListOBS',{keyPath: 'name'}) // 创建对象存储 objectStore.createIndex('name', 'name', {unique: false}) // 增加索引 objectStore.transaction.oncomplete=function(e){ // 对象存储已创建完毕 } // 打开一个对象存储的事务。你可以同时执行多个 readnoly 事务,哪怕它们的作用域有重叠;但对于在一个对象仓库上你只能运行一个 readwrite 事务。 const otherTransacton = db.transaction(['toDoListOBS'],'readwrite') // 在所有数据添加完毕后的处理 otherTransacton.oncomplete = function(event) { alert("All done!"); }; otherTransacton.onerror = function(event) { alert("error!"); }; const otherObjectStore = otherTransacton.ObjectStore('toDoListOBS'); // toDoListOBS中增加数据 const request = otherObjectStore.add({name: '234'}) // 删除 const request1 = otherObjectStore.delete('234') // 获取 const request2 = otherObjectStore.get('234') request2.onsuccess = function(event) { const result = event.target.result result.name = '234567' // 修改 otherObjectStore.put(result) } // 游标 objectStore.openCursor().onsuccess = function(event) { const cursor = event.target.result cursor.continue() // 下一个,直到cursor为undefined } // 根据索引检索 const index = objectStore.index('name') index.get('dname').onsuccess = function(e){console.log(e.target.result)} // 不唯一时获取键最小的一个 // 一个常规游标映射索引属性到对象存储空间中的对象,IDBKeyRange过滤的范围 index.openCursor([IDBKeyRange], '遍历顺序').onsuccess=function(){} // 一个键索引映射索引属性到用来存储对象存储空间中的对象的键 index.openKeyCursor().onsuccess=function(){} }- request.onsuccess=function(event){ db = event.target.result; } // 数据库打开成功/onupgradeneeded中的方法执行完毕即对象存储操作完毕
- request.onerror=function(e){ db = event.target.result; } // 异常
- 创建事务:IDBDatabase提供唯一一个能够访问和管理数据库版本的数据库连接后后,使用
IDBDatabase对象在数据库中打开一个事务, 然后进行操作或者删除数据库中的对象.方法继承自EventTarget- db.close():关闭数据库
- db.createObjectStore():创建并返回一个新的 object store 或者 index。
- db.deleteObjectStore():删除在当前连接的数据库中的 object store 和 相关的索引
- db.transaction():立即返回一个包含 IDBTransaction.objectStore 方法的 transaction 对象。你可以用这个对象来操作 object store。这个操作是在一个单独的线程中执行的。
- db.name: 数据库名称(只读)
- db.version:数据库版本(只读)
- db.objectStoreNames:当前连接连接数据库中所有的 object store 名字列表。
- db.onabort事件:在中断数据库访问时触发。
- db.onerror事件:当访问数据库失败时触发。
- db.onversionchange事件:当数据库结构发生更改时触发
4、如何接收/修改数据
- 事务操作:方法继承自EventTarget
- db:已连接的数据库事务(只读)
- durability:事务的持久值(只读)
- error:异常类型,正常时返回null
- mode:readonly、readwrite、versionchange(只读)
- objectStoreNames:该数据库的所有对象存储名(只读)
- abort():事务回滚
- objectStore():返回一个对象存储
- commit():提交事务
- abort事件
- complete事件
- error事件
- IDBRequest 处理数据库请求并提供对结果访问的通用接口。 方法继承自EventTarget
var request = window.indexedDB.open('数据库名称');- result:
- error:AbortError、ConstraintError、QuotaExceededError、UnknownError、NoError、VersionError
- source:
- transaction:
- readyState:DONE、LOADING
- onerror:
- onsuccess:
- 对象存储区:IDBObjectStore:表示允许访问通过主键查找的 IndexedDB 数据库中的一组数据的对象存储区。
- indexNames:表中对象的索引名列表。
- keyPath:表中的键路径,如果该属性为 null,每次操作表时必须提供一个键名。
- name:表名
- transaction:事务的名称,该表属于此事务。
- autoIncrement:表中自增字段的值
- add()
- clear()
- count()
- createIndex()
- delete()
- deleteIndex()
- get()
- getAll()
- getAllKeys()
- index()
- openCursor()
- put()
- IDBIndex异步获取数据库中一个index的功能
- IDBCursor迭代对象存储和索引
- IDBCursorWithValue迭代对象存储和索引并返回游标的当前值。
- IDBKeyRange定义可用于从特定范围内的数据库检索数据的键范围。
- lower:只读,下限值
- upper:只读,上限值
- lowerOpen:只读,false(包含下限)
- upperOpen只读,false(包含上限)
- bound():创建一个上下限范围
- only():仅包含该值
- lowerBloud():仅包含下限
- upperBound():仅包含上限
- includes():特定值是否包含在内
5、存储限制
- 览器的最大存储空间是动态的——它取决于您的硬盘大小。 全局限制为可用磁盘空间的 50%。在 Firefox 中,一个名为 Quota Manager 的内部浏览器工具会跟踪每个源用尽的磁盘空间,并在必要时删除数据。还有另一个限制称为组限制——这被定义为全局限制的 20%,但它至少有 10 MB,最大为 2GB。每个源都是一组(源组)的一部分。每个 eTLD+1 域都有一个组。
- 达到限制后有两种不同的反应:
- 组限制也称为“硬限制”:它不会触发源回收。
- 全局限制是一个“软限制”,因为其有可能释放一些空间并且这个操作可能持续。
5、同类对比
webStorage、localForage、dexie.js、PouchDB、idb、idb-keyval、JsStore 或者 lovefield