概述

IndexedDB 是一个低级 API,用于存储大量结构化数据(包括文件/ blob)的客户端。此 API 使用索引来启用对此数据的高性能搜索。虽然 Web 存储对于存储较少量的数据很有用,但对于存储大量结构化数据却没那么有用。创建 IndexedDB 标准是为了在浏览器中实现 Javascript 对象的可伸缩,高性能存储和检索。

基本

indexedDB 旨在存储 Javascript 对象文字,例如 {prop1 : value, prop2 : value}。此外,更近期的实现支持存储大型二进制对象(BLOB),例如图像,音频文件和视频文件。此外,indexedDB 可以存储包含其他对象(嵌套对象)的对象,例如 {prop1 : value, prop2 : {nestedprop1 : value, nestedprop2 : value}}

以下是一些基本概念:

  • 数据库 :对象存储和索引的容器。每个数据库都有一个名称和一个版本。
  • 对象存储对象的容器。这类似于关系数据库中的表。在 indexedDB 中,记录对应于 Javascript 对象,列对应于 Javascript 对象属性。添加到商店的对象按添加的顺序存储。针对商店的查询以相同的顺序检索对象。你可以在对象库中插入,更新或删除对象。
  • 索引 :对象库中包含的特定对象的特殊容器。索引也类似于表,可以理解为具有特殊约束的对象存储。当对象被插入到对象存储中时,如果它满足某些条件,它也可以插入到相应的索引存储中。索引中的对象按索引定义的顺序存储。针对索引的查询按索引定义的顺序检索对象(尽管可以将查询配置为以不同方式工作)。你无法在索引中插入,更新或删除对象(只能通过将对象插入到索引所基于的存储中来间接执行此操作)。
  • 游标 :游标类似于查询。游标迭代对象存储或索引中的对象。游标可以向前或向后移动,搜索(跳转或超前对象),并跳转到底层存储/索引中的下一个或前一个唯一对象。
  • 密钥路径 :密钥路径类似于关系数据库中表的主键(或复合主键)。在一般情况下,当你指示 indexedDB 在特定数据库中创建对象存储时,还要定义存储的密钥路径。你可以使用密钥路径快速获取特定对象,这类似于使用主键在关系表中选择记录。你可以选择使用键来确保稍后尝试将对象插入到已包含具有相同键的对象的对象存储中将产生错误。
  • 事务和请求 :请求类似于单个 SQL 查询。存在用于插入对象,删除对象,更新对象以及迭代一个或多个对象的特定 API 方法。每个方法调用对应一个请求。每个请求都发生在事务的上下文中。换句话说,多个请求可以在一个事务中发生。个别请求可能由于各种原因而失败。在单个事务中执行多个请求时,在所有请求都被视为成功之前,请求不会完全提交。以这种方式,如果在稍后的请求中发生问题,则可以回滚整个事务,使得底层对象存储的状态与事务中第一个请求发生之前的状态相同。

异步 vs 同步

indexedDB 的 Javascript API 使用异步技术。当直接与 API 交互而不是某些更高级别的第三方库时,API 需要使用 Javascript 回调。异步设计有助于防止较大的数据处理操作阻塞主 Javascript 线程,这有助于防止用户界面(你在浏览器中看到的内容)出现冻结/生涩/滞后。

支持

访问 http://caniuse.com/#feat=indexeddb

学到更多