本地数据库IndexedDB


概述

浏览器本地存储除了 cookie、localStorage、sessionStorage、web SQL database(已经凉了),还有indexedDB。

IndexedDB 是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB 允许储存大量数据,提供查找接口,还能建立索引。这些都是 LocalStorage 所不具备的。


IndexedDB特点

键值对储存: IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象。对象仓库中,数据以"键值对"的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。

持久化存储:当清除浏览器缓存后,cookie、localStorage、sessionStorage等方式存储的数据都会被清除掉的,而使用IndexedDB存储的数据则不会,除非手动删除该数据库。

异步: IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 LocalStorage 形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。

支持事务: IndexedDB 支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。

同源限制: IndexedDB 受到同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库。

储存空间大: IndexedDB 的储存空间比 LocalStorage 大得多,一般来说不少于 250MB,甚至没有上限。

支持二进制储存: IndexedDB 不仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。


IndexedDB中的基本概念

数据库:是所有相关数据的基本容器。在同源策略( 协议 + 域名 + 端口 )的前提下,每个域名下可以新建任意多的数据库。IndexedDB 中有版本概念,这就规定了同一时刻下只有一个版本的数据库存在。

对象仓库:对象仓库 ObjectStore 在 IndexedDB 中对应的是 MYSQL 中的表 Table。

数据:对象仓库中记录的是若干条数据,数据只有主键和数据体两部分,主键不能重复,可以为自增的整数编号或者数据中指定的一个属性。数据体可以是任意数据类型,不限于对象。

索引:为不同的属性建立索引可以加快数据的检索。

事务:数据的 CURD (增删查改) 都要通过事务来完成。


IndexedDB兼容性

详见:https://www.caniuse.com/#search=IndexedDB


IndexedDB使用

IndexedDB语法比较底层,使用较为麻烦;一般都使用localForage来操作IndexedDB。

localForage通过简单的key-value语法来异步存储数据。它能存储多种类型的数据,而不仅是字符串。它基于 IndexedDB 实现,并在不持支 IndexedDB 的浏览器中自动使用 WebSQL 和 localStorage。


localForage官网中文文档

使用示例:

// 配置
localforage.config({
    name: 'idoc',           // 数据库名称
    storeName:"interface",  // 仓库名称,相当于数据库中的表
});
localforage.setItem("fdas","faaaa");
localforage.setItem("fdaaaas","faaaa");


// 重新配置
localforage.config({
    name: 'idoc2',          // 数据库名称
    storeName:"interface2", // 仓库名称,相当于数据库中的表
});
localforage.setItem("fdas","faaa2a");
localforage.setItem("fdaaaas","faaaa22");

// 取值
localforage.getItem('somekey', function(err, value) {
    if(value === null){

    }else{

    }
});


举报

© 著作权归作者所有


0