IndexedDB 是什么

在现代浏览器的本地存储方案中,indexedDB 是一项重要的能力组成, 它是可以在浏览器端使用的本地数据库,可以存储大量数据,提供接口来查询,还可以建立索引,这些都是其他存储方案 Cookie 或者 LocalStorage 无法提供的能力。单从数据库类型来看,IndexedDB 是一个非关系型数据库(不支持通过 SQL 语句操作)。

IndexedDB 的主要概念

IndexedDB 是一个比较复杂的 API 组合,学习它的过程就相当于学习它的各个对象 API 接口,包括以下这些( IDB 指当前操作的数据库实例 ):

数据库:IDBDatabase 对象

仓库对象: IDBObjectStore 对象

索引:IDBIndex 对象

事务:IDBTransaction 对象

操作请求:IDBRequest 对象

指针:IDBCursor 对象

主键:IDBKeyRange 对象

在这些 API 中包含一些主要概念:

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

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

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

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

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

通过简单的对比图来理解 IndexedDB 的概念:

快速起步 IndexedDB

在介绍了 IndexedDB 的主要概念之后,可以通过一个简单实用的 CURD 例子来学习在日常开发中我们是怎么使用 IndexedDB 的,各个 API 细节日后可以慢慢深入学习。

必不可少的浏览器支持检查:

if(!('indexedDB' in window)){

console.log('当前浏览器支持 IndexedDB');

return;

} else {

console.log('您的浏览器不支持 IndexedDB')

// todo 建议升级或者更换其他浏览器

}

连接数据库

// 数据库实例

let db;

// 数据库打开操作,第一个参数是数据库名称, 第二个参数是数据库版本

let DBRequestLink = window.indexedDB.open('dataBaseName', 1)

DBRequestLink.onsuccess = function(event) {

// 获取数据库实例

db = DBRequestLink.result;

// 其他操作

};

// 这个监听回调触发于数据库首次新建、open数据库时传递新版本(只能比之前传递的版本高)

DBRequestLink.onupgradeneeded = function(event) {};

创建数据库的主键和字段

DBOpenRequest.onupgradeneeded = function(event) {

let db = event.target.result;

// 创建一个数据库存储对象,并指定主键

let objectStore = db.createObjectStore('person', {

keyPath: 'id',

autoIncrement: true

});

/* 定义存储对象的数据项

* 第一个参数是创建的索引名称,可以为空

* 第二个参数是索引使用的关键名称,可以为空

* 第三个参数是可选配置参数,可以不传,常用参数之一就是 unique ,表示该字段是否唯一,不能重复

*/

objectStore.createIndex('id', 'id', {

unique: true

});

objectStore.createIndex('name', 'name');

objectStore.createIndex('age', 'age');

objectStore.createIndex('sex', 'sex');

};

在上述操作中,我们先定义了上文中提到的 IDBObjectStore 对象,并指定主键为 id ,随后又通过 createIndex 来创建字段。值得注意的是虽然创建了四个字段,但在 IndexedDb 中数据还是分为主键 id 和数据主体两个部分,并不会像 MYSQL 中在 Table 中呈现四列。

向数据库中添加数据

// 这里的 db 就是第二步中的 db 对象,

// transaction api 的第一个参数是数据库名称,第二个参数是操作类型

let newItem = {

id: 1,

name: '徐嘻嘻',

age: 3,

sex: 'female'

};

let transaction = db.transaction('dataBaseName', "readwrite");

// 找到对应的存储对象

let objectStore = transaction.objectStore('person');

// 添加到数据对象中, 传入JavaScript对象

objectStore.add(newItem);

新建操作是在新建了一个 事务( IDBTransaction 对象)的前提下完成的,传入的数据不需要做任何转换,可以无缝传入 JavaScript 对象。

修改数据库中的数据

// 这里的 db 就是第二步中的 db 对象,

// 新建事务

let transaction = db.transaction('dataBaseName', "readwrite");

// 新数据主体

let newRecord = {

id: 1,

name: '徐嘎嘎',

age: 5,

sex: 'male'

};

// 打开已经存储的数据对象

let objectStore = transaction.objectStore('person');

// 获取存储的对应键的存储对象, 传入主键 id,值为 1

let objectStoreRequest = objectStore.get(1);

// 获取成功后替换当前数据

objectStoreRequest.onsuccess = function(event) {

// 数据

var record = objectStoreRequest.result;

// 遍历替换

for (let key in newRecord) {

if (typeof record[key] != 'undefined' || key !== 'id') {

record[key] = newRecord[key];

}

}

// 更新数据库存储数据

objectStore.put(record);

};

基本思路是创建一个事务,先找到想要修改的数据主体,然后在更新该数据主体内容。 事务创建逻辑相同,并在创建之后调用事务的 get 和 put 操作。

删除数据库中的数据

// 这里的 db 就是第二步中的 db 对象,

// 新建事务

let transaction = db.transaction('dataBaseName', "readwrite");

// 打开已经存储的数据对象

let objectStore = transaction.objectStore('person');

// 获取存储的对应键的存储对象, 传入主键 id,值为 1

let objectStoreRequest = objectStore.delete(1);

调用 delete 接口,传入指定的 id 即可。

佛山vi设计https://www.houdianzi.com/fsvi/ 豌豆资源搜索大全https://55wd.com

可以提效的类库

​ 从上面的例子中可以看出,每一次操作需要至少三行代码才能完成,而且需要一直维护 DB 的对象引用,避免它被回收,这样子开发代码膨胀得太厉害,所以我们在业务中引入其他类库来减少代码量

LocalForage

可以指定数据存储方案,默认依次为 IndexedDB、WebSQL、LocalStorage,意味着当前 IndexedDB 失效可以有兜底措施。

API 简化为 CRUD ( getItem、removeItem、setItem、clear )

库大小为 475b

Pouchdb

API 简化为 put、get、remove,基于 promise 来检查回收错误

有较好的错误日志机制, 如失败,冲突等等,方便调试

库大小为 255b

这两个类库比较符合我们的开发要求,我们当前使用的是 LocalForage。

结束语

在业务开发中,我们都会碰到或多或少的本地存储需求,本文介绍了其中一种存储方案 IndexedDB 的简单实践。就我们的应用场景来看,IndexedDB 的适用面还是很广的。考虑到 IE10 也可以支持,把它实践在实际项目中应该是没有问题的。

浏览器本地mysql_IndexedDB:浏览器里的本地数据库相关推荐

  1. 浏览器使用java_java如何调用本地的浏览器

    1.调用本地的浏览器 import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; p ...

  2. android api 打开慢,为什么下了android 4.1 的SDK后在本地用浏览器看api说明文档时,浏览器打开api的html文件很慢?试了好几款浏览器都一样。为什么?...

    wpf程序热键的一个类 using System; using System.Collections.Generic; using System.Linq; using System.Runtime. ...

  3. 手机chrome浏览器真机调试PC端本地的项目

    1.本次实验环境 操作系统: win10 10.0.19042 chrome浏览器PC端: 97.0.4692.99(正式版本) (64 位) 手机操作系统:Android 10; MIX 2S Bu ...

  4. c 访问阿里云mysql_本地怎样访问阿里云mysql数据库服务器

    全网最新活动请看下方内容或右侧内容! --------------- 本地怎样访问阿里云mysql数据库服务器,在阿里云上放数据库. 对于大多数小型或初期项目来说,我们可能常用的做法是先将web.数据 ...

  5. python爬取玉米、小麦、水稻信息数据到本地为网页形式和mysql数据库中

    1.创建Scrapy项目 scrapy startproject ExGrain 2.进入项目目录,使用命令genspider创建Spider scrapy genspider exgrain ex- ...

  6. 怎么配置网站mysql数据库_本地DZ网站如何配置本地MYSQL数据库

    以下为学做网站论坛关于"本地DZ网站如何配置本地MYSQL数据库"讲解视频教程. 访问本地环境下的数据库:127.0.0.1/phpmyadmin/ MySQL数据同步主要有三种方 ...

  7. 如何更换里讯浏览器的皮肤?里讯浏览器更换皮肤的方法

    里讯浏览器是一款极速.纯净的浏览器,软件拥有多种颜色的皮肤,可以根据个人的喜好更换自己喜欢的颜色,那么,怎么进行换肤呢?下面就由小编来告诉大家里讯浏览器换肤的方法. 方法步骤 1.打开里讯浏览器软件. ...

  8. 计算机属性没有共享,win10系统本地连接属性里没有共享选项的具体方案

    有关win10系统本地连接属性里没有共享选项的操作方法想必大家有所耳闻.但是能够对win10系统本地连接属性里没有共享选项进行实际操作的人却不多.其实解决win10系统本地连接属性里没有共享选项的问题 ...

  9. Epic启动器里添加本地UE4版本

    想要在Epic启动器里添加本地引擎 1.在EpicGames中,选择要下载的UE4版本,然后指定下载路径. 2.拷贝你已经下载好的虚幻4版本,例如4.22.3版本 3.将其拷贝到第1步的目录下,比如& ...

  10. linux服务器安装mysql数据库并通过本地Navicat连接访问远程mysq数据库

    之前因为项目需要,所以自己在linux服务器上安装了mysql数据库,但是自己在安装mysql数据库的时候也是遇到了很多的问题,所以特此在本博客中介绍一下如何在linux服务器上进行mysql数据库的 ...

最新文章

  1. Linux下stat + 文件名后, Access,Modify,Change的含义
  2. 最新OCR开源神器来了!
  3. 中科院陆汝钤获吴文俊人工智能最高成就奖,百度王海峰获吴文俊人工智能杰出贡献奖...
  4. asp.net c#截取指定字符串函数
  5. 揭露男生的真实心理年龄测试软件,心理年龄测试
  6. SQL Server聚集索引的选择
  7. javascript --- 编程风格
  8. Iterator(迭代器)--对象行为模式
  9. Ubuntu 上不了网
  10. 我的nginx+php是如何配置的?
  11. find5 android 4.3,OPPO Find 7的手机系统是什么?能升级安卓4.3吗?
  12. IM系统中聊天记录模块的设计与实现
  13. DB2 开发系列 从入门开始--概述
  14. 【多元统计分析】主成分分析——SPSS上机实验【过程+结果分析】
  15. 网络规划设计和具体实施
  16. 基于MATLAB的隐函数偏导与多重积分(附代码)
  17. 手机连接wifi时使用固定mac地址
  18. selenium基础自学七(获取超链接)
  19. 线上3D产品展示的方式
  20. Go语言学习之路(二)

热门文章

  1. JavaScript Book Plan
  2. Android应用程序键盘(Keyboard)消息处理机制分析(8)
  3. 2011年3月华章新书书讯:ASP.NET本质论、Erlang编程指南、SNS网站构建
  4. Entity SQL Language 三 Where/Exists/In/Like/参数及外键查询
  5. dedecms调用自定义会员模型会员信息的方法
  6. Citus中的分片策略:Append Distribution追加分配
  7. 给大家分享微信小说域名防封最新的解决方案
  8. mysql创建字段非空NOT NULL的好处
  9. C#根据execl批量修改图片名称
  10. android应用程序的混淆打包(转)