IndexedDB 中文教程

IndexedDB 中文教程

本文通过对IndexedDB的概念、API进行详解,讲清楚IndexedDB中的事务机制,以及objectStore这个核心概念。和一般的教程不同,这篇文章除了一步一步搭建起一个IndexedDB数据库操作的流程,连接、选择、读取、更新等,而且还把最常用的API接口列举出来,方便开发者在一个地方就可以完成所有查询。

前言【原创不易,请尊重版权】

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【转载请注明来源】

indexedDB 是 html5 标准未经授权,禁止复制转载。未经授权,禁止复制转载。引入的web数据持久化方案之一,现代浏览未经授权,禁止复制转载。【转载请注明来源】器大多按照标准对其进行了实现,我在新的项原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。目中用到它来作为持久化数据存储,于是详细原创内容,盗版必究。原创内容,盗版必究。研究了一番,MDN 上的解释虽然权威,但【本文受版权保护】原创内容,盗版必究。是由于知识不成体系,细节也讲的不透,所以【转载请注明来源】转载请注明出处:www.tangshuang.net我打算自己写一篇教程,对 indexed【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】DB 的各个细节进行详解。

【原创内容,转载请注明出处】【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。

IndexedDB 在线视频教程,7个课著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net时让你精通 indexedDB 的操作和原创内容,盗版必究。【本文首发于唐霜的博客】理解底层标准设计,助你在前端开发中游刃有未经授权,禁止复制转载。【作者:唐霜】余地使用数据存储

转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。

为了和读者更贴近,我做了上面这套【本文受版权保护】视频教程本文作者:唐霜,转载请注明出处。,总共7个课时,每天一小时,7天可学完。【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】虽然本文的内容已经覆盖了所有与 inde【本文受版权保护】本文作者:唐霜,转载请注明出处。xedDB 相关的内容,但是视频教程的方【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。式更轻松,而且其中有关概念的部分讲解的更【未经授权禁止转载】本文作者:唐霜,转载请注明出处。详细。掌握一门技术,不需要很长时间,7天【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】就可以。视频教程是付费教程,价格不贵,写本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。教程真的不容易,希望大家多支持。

著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net

架构体系原创内容,盗版必究。

本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】

这里说的结构体系,是指在 indexed著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。DB 中,几个重要的概念之间的关系。这些著作权归作者所有,禁止商业用途转载。【本文受版权保护】概念包括:

【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】

简单的说,indexedDB 是非关系型本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】数据库,数据组织不像 SQL 数据库一样【未经授权禁止转载】【本文受版权保护】,有表和字段,indexedDB 里面没【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】有表和字段的概念,它的最小组织单位(un原创内容,盗版必究。【转载请注明来源】it)是 key-value。在 ind【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】exedDB 里,一对 key-valu【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。e 就相当于 SQL 数据库里面的一条记【转载请注明来源】本文作者:唐霜,转载请注明出处。录,是数据的最终体现形式。我们通过下面的【转载请注明来源】本文版权归作者所有,未经授权不得转载。图来阐述 indexedDB 和 SQL【本文首发于唐霜的博客】未经授权,禁止复制转载。 数据库结构体系的不同,以帮助理解。

【转载请注明来源】原创内容,盗版必究。原创内容,盗版必究。转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。

【关注微信公众号:wwwtangshuangnet】【转载请注明来源】原创内容,盗版必究。

关系型数据库和非关系型数据库本身有非常大本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】的差别,关系型数据库大致上架构是一致的,【原创不易,请尊重版权】【原创不易,请尊重版权】但是非关系型数据库的架构各式各样,很不统【转载请注明来源】本文作者:唐霜,转载请注明出处。一。就 SQL DB 和 indexed著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。DB 而言:

未经授权,禁止复制转载。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】【本文首发于唐霜的博客】

indexedDB 中的 objectS本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】tore 虽然和 SQL DB 中的 t【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。able 非常像,但是它们的存储形式却极【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net其不同。objectStore 比 ta【本文首发于唐霜的博客】【转载请注明来源】ble 简单的多。

【原创不易,请尊重版权】【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】

同时,indexedDB 内置了事务系统【未经授权禁止转载】【原创不易,请尊重版权】,所有读写操作都是在事务中完成。

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【原创内容,转载请注明出处】

数据库【访问 www.tangshuang.net 获取更多精彩内容】

【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net

indexedDB 是一个完备模型的数据【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。库,有标准的数据库结构体系。它虽然不是一【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】个运行时服务,而是基于文件的即时存取数据原创内容,盗版必究。【版权所有,侵权必究】库,但是仍然可以用其他数据库的模型思维来【作者:唐霜】【作者:唐霜】了解它。在 indexedDB 中,我们【转载请注明来源】【本文受版权保护】可以创建多个数据库,每个数据库有自己独立【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。的空间。

原创内容,盗版必究。【本文首发于唐霜的博客】【原创内容,转载请注明出处】

连接数据库未经授权,禁止复制转载。

【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【本文受版权保护】

要在 indexedDB 中存储数据,要【原创内容,转载请注明出处】【本文受版权保护】进行两步操作,第一步连接到某个数据库,第本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。二步挑选某个 objectStore 进【原创不易,请尊重版权】【转载请注明来源】行数据操作。现在讲解连接到 indexe著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】dDB 数据库。在 window 对象上【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】有一个 indexedDB 对象,直接调未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。用 open 方法进行打开,如果该数据库【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。不存在,则创建一个新的数据打开:

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net
const request = window.indexedDB.open('mydb', 1)

open有两个参数:【原创内容,转载请注明出处】

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

数据库版本【访问 www.tangshuang.net 获取更多精彩内容】

【转载请注明来源】本文版权归作者所有,未经授权不得转载。【本文受版权保护】

上面的version参数对于初学者而言不本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。是很好理解。如果你用过 docker 的未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。话,知道有一个东西叫镜像(image),转载请注明出处:www.tangshuang.net【转载请注明来源】在镜像的基础上构建自己的容器,可以再创建本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】一个新的镜像,那么这个新的镜像其实就包含原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】了老的镜像。这里的 version 也类转载请注明出处:www.tangshuang.net原创内容,盗版必究。似,它表示当前的数据库结构的版本。ver【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】sion 必须是正整数,只能升不能将,只【未经授权禁止转载】【原创内容,转载请注明出处】有当需要进行数据库结构修改的时候,才需要本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。升级 version。

【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。

例如,一开始,version 为 1,创【未经授权禁止转载】未经授权,禁止复制转载。建了一些 objectStore,当你需【未经授权禁止转载】【本文首发于唐霜的博客】要添加新的 objectStore 或者本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】修改某些 objectStore 的时候原创内容,盗版必究。【原创内容,转载请注明出处】,就需要升级 version。一个数据库【本文受版权保护】转载请注明出处:www.tangshuang.net只能在同一时间存在一个 version,著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。不能同时存在多个 version。当你的【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。 version 升级之后,你还用老的 【原创不易,请尊重版权】【本文受版权保护】version 去连接数据库,并进行数据著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】操作时,会抛出错误。

【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】【转载请注明来源】

补充:有同学留言想对这个问题进行深入探讨【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】。我这里说一下我的想法。从项目的开发上讲【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】,我们只会在发布代码时去升级 versi原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.neton,而不会在程序运行过程中通过程序去更转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。改 version,因为一旦用户刷新页面【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】,这个 version 会变成代码中设置未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】的 version,这会造成错误。我们升未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net级 version,是为了对数据库结构进本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。行修改,触发 onupgradeneeded 方法。转载请注明出处:www.tangshuang.net

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【作者:唐霜】本文作者:唐霜,转载请注明出处。

在MDN里面有这样一句话:【原创内容,转载请注明出处】When you call open()【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。 with a greater vers【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】ion than the actual 【本文受版权保护】未经授权,禁止复制转载。version of the datab【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】ase, all other open 【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。databases must expli【版权所有,侵权必究】【未经授权禁止转载】citly acknowledge th【本文首发于唐霜的博客】【本文首发于唐霜的博客】e request before you【原创不易,请尊重版权】【原创内容,转载请注明出处】 can start making ch原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netanges to the databas【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】e (an onblocked even【版权所有,侵权必究】【本文首发于唐霜的博客】t is fired until the本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】y are closed or relo【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。aded). 也就是说,1. 你要传入一个更大当版本【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。来触发 onupgradeneeded,【转载请注明来源】【关注微信公众号:wwwtangshuangnet】2. 在数据库处于 open 状态时,对【作者:唐霜】本文版权归作者所有,未经授权不得转载。数据库对修改是被 block 住,直到它【版权所有,侵权必究】【原创内容,转载请注明出处】被 close 或 reload 之后,【原创内容,转载请注明出处】原创内容,盗版必究。这些修改才会生效。

【原创内容,转载请注明出处】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】
【作者:唐霜】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【未经授权禁止转载】

现在你需要记住的是,在后面的代码操作中,【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】你要时刻保证你使用对了 version,本文作者:唐霜,转载请注明出处。【本文受版权保护】它的使用场景只有两种:

【版权所有,侵权必究】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】

从代码的层面来看,并非这两个事情发生才触【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。发了 version 的改变,恰恰相反,【本文首发于唐霜的博客】【转载请注明来源】如果你要修改或添加 objectStor本文作者:唐霜,转载请注明出处。原创内容,盗版必究。e,你必须通过传递新的 version 【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。参数到 open 方法中,触发 onupgradeneeded,在 on【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】upgradeneeded 的回调函数中【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net才能实现目的。

【原创内容,转载请注明出处】【本文受版权保护】【转载请注明来源】【本文受版权保护】

获得 db 容器原创内容,盗版必究。

未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】

怎么从上面的 open 方法之后,获得可【转载请注明来源】本文作者:唐霜,转载请注明出处。以用来进行操作的数据库对象容器:

本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。
const request = window.indexedDB.open('mydb', 1)
request.onsuccess = e => {
  const db = e.target.result
}

这样就获得了db的容器,利用该容器,我们本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net就可以进行数据库的下一步操作。

【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】

这是一个异步的操作,你不能在上面代码之后【本文首发于唐霜的博客】【原创内容,转载请注明出处】直接使用 db 变量,而是要在 onsu【原创不易,请尊重版权】【作者:唐霜】ccess 的函数体内继续写代码。而且 【转载请注明来源】【作者:唐霜】indexedDB 的所有编程都是这样,本文作者:唐霜,转载请注明出处。原创内容,盗版必究。这会导致嵌套层层加深,因此,我们这篇文章【作者:唐霜】【本文首发于唐霜的博客】后面还会提供使用 Promise 进行封【原创内容,转载请注明出处】【作者:唐霜】装的类,使用该类你无需做复杂的操作。

【转载请注明来源】转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net

objectStore【版权所有】唐霜 www.tangshuang.net

【版权所有,侵权必究】【作者:唐霜】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

objectStore 是 indexe【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】dDB 中非常核心的概念,它是数据的存储未经授权,禁止复制转载。【原创不易,请尊重版权】仓库,一个 objectStore 类似【本文首发于唐霜的博客】【未经授权禁止转载】于 SQL 数据库中的表,存放着相关的所本文版权归作者所有,未经授权不得转载。【本文受版权保护】有数据记录。

【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

什么是 objectStore?【本文首发于唐霜的博客】

【版权所有,侵权必究】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net

indexedDB 是 key-valu【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.nete 数据库,具体体现就是 objectS【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】tore. objectStore 是 著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。indexedDB 的数据存储机制,和 【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】SQL 的表的地位一致。每一条记录包含了原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。 key 和 value。

【本文首发于唐霜的博客】【本文首发于唐霜的博客】【原创内容,转载请注明出处】【转载请注明来源】

未经授权,禁止复制转载。【本文受版权保护】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

indexedDB 之所以将自己的存储机著作权归作者所有,禁止商业用途转载。【转载请注明来源】制称为 objectStore,在 st【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。ore 前面加上 object,是因为它【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net所存储的记录的集合,就像一个 objec【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】t 一样,是一个 key-value 的原创内容,盗版必究。本文作者:唐霜,转载请注明出处。集合。

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【本文首发于唐霜的博客】未经授权,禁止复制转载。

什么是 key?【作者:唐霜】

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】

key 是 value 的标记值。转载请注明出处:www.tangshuang.net

【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【本文受版权保护】本文作者:唐霜,转载请注明出处。【转载请注明来源】

我们通过 key 得到 indexedD本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】B 中存储的对应值。要获得 value,【原创不易,请尊重版权】未经授权,禁止复制转载。必须通过 key 来获得。key 和 v【转载请注明来源】【本文受版权保护】alue 具有绑定关系,key 相当于 【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。value 的缩写、别名、标记。

未经授权,禁止复制转载。【本文受版权保护】【原创内容,转载请注明出处】【原创内容,转载请注明出处】

但和 localStorage 不同,i本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】ndexedDB 的 key 有两种形态【本文受版权保护】著作权归作者所有,禁止商业用途转载。:inline 和 outline。in著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。line key 是指 key 被包含在转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。 value 中,例如你存储的 valu本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】e 是对象时,就可以将 key 包含在 【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】value 中。outline key 【本文受版权保护】【本文受版权保护】则是不被包含在 value 中,例如你存【未经授权禁止转载】转载请注明出处:www.tangshuang.net储的是字符串,或者 ArrayBuffe转载请注明出处:www.tangshuang.net【版权所有,侵权必究】r,就不可能在 value 中包含 ke【作者:唐霜】本文作者:唐霜,转载请注明出处。y,这种情况下通过开启 autoIncr【本文首发于唐霜的博客】【原创内容,转载请注明出处】ement 来实现,下文会详细介绍。

转载请注明出处:www.tangshuang.net【未经授权禁止转载】【转载请注明来源】【作者:唐霜】【原创不易,请尊重版权】

【转载请注明来源】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】

上图中上面一条记录的 value 是一个【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。对象,key 来自对象的 id 属性值,【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】这个 key 是 inline key。【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net下面一条记录,value 是一个字符串,【版权所有,侵权必究】原创内容,盗版必究。key 是由系统自动生成,这个 key 【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net是 outline key。

【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net

例如有一个值是 【本文受版权保护】{ body: { color: 'red' } } 而 keyPath 为 本文作者:唐霜,转载请注明出处。body.color,那么就可以得到 key 为 本文作者:唐霜,转载请注明出处。red。这可能和我们以前理解的地方有所不同。在【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。 IndexedDB 中,我们要通过 r【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.neted 去找到这个值。

【作者:唐霜】【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。【转载请注明来源】

什么是 keyPath?【本文首发于唐霜的博客】

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】【本文受版权保护】

keyPath 是指在对象中,获取一个节【原创不易,请尊重版权】【原创不易,请尊重版权】点值的属性链式方法的字符串表达。例如:

【本文首发于唐霜的博客】【作者:唐霜】著作权归作者所有,禁止商业用途转载。【作者:唐霜】
{
  books: [
    { name: 'My Uncle Tom', price: 13.4 }
  ],
}

其中我要获得第一本书的价格,那么它的 k【本文首发于唐霜的博客】【本文受版权保护】eyPath 就是 ‘boo【原创不易,请尊重版权】【版权所有,侵权必究】ks[0].price’。它原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】是一个字符串,但可以用来表达获得一个节点【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net值的属性路径。所以,keyPath 这个【未经授权禁止转载】【原创内容,转载请注明出处】单词中的 path 就是这个意思。

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】原创内容,盗版必究。原创内容,盗版必究。

key 和 keyPath 的联系【版权所有,侵权必究】

【本文首发于唐霜的博客】【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net

keyPath 的作用是读取 key。本文版权归作者所有,未经授权不得转载。

【版权所有,侵权必究】【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。

key 是 value 的 keyPat【转载请注明来源】【未经授权禁止转载】h 的值。

【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net
【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

这句话的意思是:1. value 是一个转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。对象,2. 以 keyPath 作为属性【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net路径从 value 中读取某个节点的值;转载请注明出处:www.tangshuang.net【本文受版权保护】3. 这个值就是 key。当然,这里面有【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。一些前提条件,例如“value 是一个对未经授权,禁止复制转载。【本文首发于唐霜的博客】象”,不是字符串,“value 存在 k本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.neteyPath,并能读取值”。

【未经授权禁止转载】【本文受版权保护】未经授权,禁止复制转载。

一般而言,keyPath 在创建 obj【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。ectStore 和 index 的时候【关注微信公众号:wwwtangshuangnet】【本文受版权保护】就已经确定了,不会改。所以,在实际编程的【本文首发于唐霜的博客】【本文首发于唐霜的博客】时候,我们很少会去用 keyPath,而转载请注明出处:www.tangshuang.net原创内容,盗版必究。是拿到一个 key 进行操作。

【原创内容,转载请注明出处】【原创不易,请尊重版权】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】

keyPath 的高级用法是,支持一个数【未经授权禁止转载】【作者:唐霜】组作为 keyPath,但这个我们不深入本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】探讨。如果 keyPath 是一个数组,【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。表示在查询的时候,只要其中之一可以查到值原创内容,盗版必究。【版权所有,侵权必究】,就返回得到的值。

【本文受版权保护】转载请注明出处:www.tangshuang.net【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net

对于 outline key 的情况,在转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】创建 objectStore 时,我们不本文版权归作者所有,未经授权不得转载。【转载请注明来源】能传 keyPath,并且开启 auto未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.netIncrement,indexedDB 【本文首发于唐霜的博客】原创内容,盗版必究。会默认以 ‘id’原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】; 作为 keyPath,但我们不会用到【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】这个 ‘id’。

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【作者:唐霜】【本文受版权保护】本文版权归作者所有,未经授权不得转载。

可以存储哪些数据类型?【本文受版权保护】

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】

根据 w3c 文档【未经授权禁止转载】描述【版权所有,侵权必究】,indexedDB 可以存储的数据类型【关注微信公众号:wwwtangshuangnet】【转载请注明来源】为:

【转载请注明来源】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。转载请注明出处:www.tangshuang.net

String, Date, Object【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。, Arra, File【作者:唐霜】Blob【未经授权禁止转载】ImageData等等。另外,网上很多人指出,支持存储 A转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】rrayBuffer。

著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【未经授权禁止转载】

根据 w3c 的描述,凡是能进行序列化的转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】值,都可以被 indexedDB 存储。本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。也就是说,不能被序列化的,例如自引用的 【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。object,或者某些类的实例,还有 f著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。unction,就不能被 indexed未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。DB 存储。简单理解就是,不能存func转载请注明出处:www.tangshuang.net原创内容,盗版必究。tion等非结构化的数据,object必【原创内容,转载请注明出处】【本文受版权保护】须是以键值对组成的字面对象。

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】

创建 objectStore转载请注明出处:www.tangshuang.net

本文版权归作者所有,未经授权不得转载。【转载请注明来源】【本文首发于唐霜的博客】

创建 objectStore 和修改 o本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】bjectStore 都只能在 db 的转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】 onupgradeneeded 事件中进【本文受版权保护】本文版权归作者所有,未经授权不得转载。行,因此,要创建 objectStore原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。,必须在前面的 open 操作那个时候来转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】进行。

【版权所有,侵权必究】【本文首发于唐霜的博客】原创内容,盗版必究。
const request = window.indexedDB.open('mydb', 1)
request.onupgradeneeded = (e) => {
  const db = e.target.result
  db.createObjectStore('mystore', { keyPath: 'id' })
}
request.onsuccess = (e) => {
  const db = e.target.result
  // ...
}

上面的红色代码中,我们使用 create原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。ObjectStore 方法来实现 ob著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netjectStore 的创建。但是,需要注【转载请注明来源】未经授权,禁止复制转载。意的是,一个 database 中,只允【作者:唐霜】【原创不易,请尊重版权】许存在一个同名的 objectStore【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net,因此,如果你第二次 createObj【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。ectStore 相同名的objectS【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。tore,程序会报错。比如你的程序如果像【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。上面这样写,必然会遇到一个问题,就是当你【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。更新 version 的时候,会再次执行本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。 createObjectStore,那本文作者:唐霜,转载请注明出处。【未经授权禁止转载】么就会报错,程序就会中断。另一个注意点是【原创内容,转载请注明出处】【原创不易,请尊重版权】,一旦一个 objectStore 被创【版权所有,侵权必究】【未经授权禁止转载】建,它的 name 和 keyPath 本文作者:唐霜,转载请注明出处。【未经授权禁止转载】是不能修改的。那么有什么办法来控制呢?通转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。过一个判断,判断是否已经存在同名的 ob著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】jectStore 即可。

【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【原创内容,转载请注明出处】
const request = window.indexedDB.open('mydb', 1)
request.onupgradeneeded = (e) => {
  const db = e.target.result
  if (!db.objectStoreNames.contains('mystore')) {
    db.createObjectStore('mystore', { keyPath: 'id' })
  }
}
request.onsuccess = (e) => {
  const db = e.target.result
  // ...
}

onupgradeneeded 不会在每未经授权,禁止复制转载。【原创不易,请尊重版权】次刷新页面的时候执行,而是在刷新页面时,未经授权,禁止复制转载。【原创不易,请尊重版权】indexedDB 发现 version【本文受版权保护】未经授权,禁止复制转载。 被升级了的时候执行。因此,所有的数据库【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】结构的东西,都要放在这个函数内去做。

本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】转载请注明出处:www.tangshuang.net

objectStore 创建之后不可修改【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。,如果创建时失误,给了错误的配置,必须先原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。删除该 objectStore 之后,重【原创内容,转载请注明出处】原创内容,盗版必究。新创建。

【本文首发于唐霜的博客】原创内容,盗版必究。【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】

objectStore 的类型【版权所有】唐霜 www.tangshuang.net

【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

在编程上,不需要去分 objectSto本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。re 的类型。但是,在我们实际存储数据的转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】时候,我们自己需要去区分,因为不同类型的【未经授权禁止转载】【原创不易,请尊重版权】 objectStore 用法不同。

原创内容,盗版必究。【转载请注明来源】【本文首发于唐霜的博客】【作者:唐霜】【本文受版权保护】

对象型仓库【转载请注明来源】

【未经授权禁止转载】【本文受版权保护】本文版权归作者所有,未经授权不得转载。

如果一个 objectStore 是用来【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】存对象的,那么这种情况下你应该每次都存入【原创内容,转载请注明出处】【版权所有,侵权必究】一个对象,而且,这个对象有一个属性路径是【转载请注明来源】未经授权,禁止复制转载。规定的 keyPath。倘若这个对象不存原创内容,盗版必究。本文作者:唐霜,转载请注明出处。在对应的 keyPath,那么就会报错。

原创内容,盗版必究。【转载请注明来源】原创内容,盗版必究。【原创内容,转载请注明出处】【原创内容,转载请注明出处】

这里的对象不包括数组。本文作者:唐霜,转载请注明出处。

原创内容,盗版必究。【未经授权禁止转载】【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。
db.createObjectStore('mystore', { keyPath: 'id' })

非对象型仓库本文作者:唐霜,转载请注明出处。

【转载请注明来源】未经授权,禁止复制转载。未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

如果一个 objectStore 是用来【作者:唐霜】本文作者:唐霜,转载请注明出处。存非对象的,例如我们经常会考虑用来存 A转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。rrayBuffer,这个时候,你应该在【原创内容,转载请注明出处】【原创不易,请尊重版权】创建 objectStore 的时候,传【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。入配置信息 autoIncrement 【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】为 true,不传 keyPath。

【版权所有,侵权必究】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net
db.createObjectStore('mystore', { autoIncrement: true })

这种情况下,存入数据(ArrayBuff【原创内容,转载请注明出处】【本文首发于唐霜的博客】er)时,key 会被自动添加上,且跟 【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】SQL 数据的自增字段一样,索引值会在原本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】有基础上自加 1。在查询或更新值的时候,【本文首发于唐霜的博客】【本文受版权保护】都要使用这个值作为 key。但是,这种情【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。况下,会有一个问题,key 是在运行时保【未经授权禁止转载】【未经授权禁止转载】存在内存中的,一旦用户刷新页面,你就不知【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】道刚刚插入的值的 key 了。对于这种情【本文首发于唐霜的博客】【作者:唐霜】况,如果想持久化,可以和 localSt【原创内容,转载请注明出处】原创内容,盗版必究。orage 一起使用来解决。

本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【转载请注明来源】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

混合仓库【原创不易,请尊重版权】

【本文受版权保护】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。

如果你硬是要在一个 objectStor本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。e 中混合存值,那么必须按照非对象型仓库【本文受版权保护】【关注微信公众号:wwwtangshuangnet】来使用。但是会有一个不一样的地方,当你存著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。入一个对象时,如果该对象中并没有对应的 【本文受版权保护】【未经授权禁止转载】keyPath,那么,它会在存入时被自动【原创不易,请尊重版权】【作者:唐霜】加上这个 keyPath。这一点非常奇怪【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】,你会发现,存入 string, Blo【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】b 和存入 object 的效果竟然不同【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。
db.createObjectStore('mystore', { keyPath: 'id', autoIncrement: true })

当你插入的对象中不存在 id 属性时,对【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net象会被污染,会自动加上 id 属性,并且【本文受版权保护】原创内容,盗版必究。赋予一个数字作为 key。

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】未经授权,禁止复制转载。

什么是 autoIncrement?本文作者:唐霜,转载请注明出处。

【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

前面提到过 autoIncrement,【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。但是没有详细解释。这需要涉及到一个叫 key generator未经授权,禁止复制转载。 的东西,但是它过于底层,我们这里不深入【本文受版权保护】未经授权,禁止复制转载。讲解,你可以自行了解,我们这里做简化说明【版权所有,侵权必究】【原创不易,请尊重版权】。autoIncrement 是一个配置原创内容,盗版必究。原创内容,盗版必究。。当创建 objectStore 时,如原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】果 autoIncrement 被设置为【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。 true,那么它的 key 将具备自动未经授权,禁止复制转载。【原创内容,转载请注明出处】生成的能力。

【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。

什么是自动生成?【原创不易,请尊重版权】

著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【本文受版权保护】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net

对于对象型仓库,如果新增的值不存在对应的【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net key,那么被存的值会被“污染”。标准原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】文档中是这么说的:“Then the v【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。alue provided by the原创内容,盗版必究。本文作者:唐霜,转载请注明出处。 key generator is us【原创内容,转载请注明出处】原创内容,盗版必究。ed to populate the k【作者:唐霜】著作权归作者所有,禁止商业用途转载。ey value.”也就是说,你在取出这原创内容,盗版必究。【转载请注明来源】个值的时候,这个 key 被添加到了值上本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】,也就是说,存入的值被改了(添加了属性)【关注微信公众号:wwwtangshuangnet】【转载请注明来源】

【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】

对于我们开发者而言,一般的建议是,如果你未经授权,禁止复制转载。【版权所有,侵权必究】的 objectStore 用于存储对象本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。,尽量不要开启 autoIncremen未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】t 功能。只有在储存非对象值时,一定要开【原创不易,请尊重版权】【本文受版权保护】启 autoIncrement 功能。不【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】建议使用混合型仓库。

【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】原创内容,盗版必究。【作者:唐霜】本文作者:唐霜,转载请注明出处。

index【本文首发于唐霜的博客】

本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【转载请注明来源】未经授权,禁止复制转载。【原创不易,请尊重版权】

索引是 indexedDB 中最值得玩味本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。的部分,这也是它取名“indexedDB【本文受版权保护】【作者:唐霜】”的原因。索引,是一系列概念的统称:

【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】

简单的说,索引是独立于 objectSt【未经授权禁止转载】转载请注明出处:www.tangshuang.netore 之外,但又和 objectSto转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】re 绑定的,用于建立更多查询线索的工具【未经授权禁止转载】转载请注明出处:www.tangshuang.net

【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】

什么是 index?【版权所有】唐霜 www.tangshuang.net

【作者:唐霜】未经授权,禁止复制转载。未经授权,禁止复制转载。

本质上,一个 index 是一个特殊的 【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.netobjectStore,它的存储结构和 未经授权,禁止复制转载。未经授权,禁止复制转载。objectStore 基本一致,也有自【作者:唐霜】【转载请注明来源】己的 name(本文标记为 indexN【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。ame), keyPath, key 和本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。 value。特殊之处在于,索引的 ke【未经授权禁止转载】转载请注明出处:www.tangshuang.nety 具有一定的逻辑约束,例如 uniqu著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。e 用于规定该 key 是唯一的。

著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【转载请注明来源】

上图是一个 index 存储器的示意图,【本文首发于唐霜的博客】原创内容,盗版必究。一个 objectStore 可以有多个【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。 index 和自己绑定。

著作权归作者所有,禁止商业用途转载。【转载请注明来源】【本文首发于唐霜的博客】原创内容,盗版必究。转载请注明出处:www.tangshuang.net

index 和 objectStore 未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】的关系

【转载请注明来源】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】

index 依附于 objectStor【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。e。我们在创建索引时,首先要得到一个 o【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。bjectStore,再在这个 obje【原创内容,转载请注明出处】【原创不易,请尊重版权】ctStore 的基础上创建一个索引。一【本文首发于唐霜的博客】【作者:唐霜】个 objectStore 可以有多个索本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。引。

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【本文受版权保护】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。

index 的 key 和 value 【作者:唐霜】本文版权归作者所有,未经授权不得转载。全部来自 objectStore。key【转载请注明来源】未经授权,禁止复制转载。 为某条记录的 keyPath(inde【作者:唐霜】原创内容,盗版必究。x.keyPath)的值,value 为【版权所有】唐霜 www.tangshuang.net【本文受版权保护】这条记录的 key(objectStor【本文首发于唐霜的博客】【转载请注明来源】e.key)。index 中的一条记录自【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】动和 objectStore 中的对应记【作者:唐霜】著作权归作者所有,禁止商业用途转载。录绑定,当 objectStore 中的原创内容,盗版必究。原创内容,盗版必究。记录发生变化时,index 中的记录会自【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net动被污染(自动更新)。

【未经授权禁止转载】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。

原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

index 实际上是对 objectSt转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netore 查询条件的补充。如果没有 ind本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】ex,我们只能通过 objectStor【原创内容,转载请注明出处】原创内容,盗版必究。e 的 key 来查值,但是有了 ind【转载请注明来源】【本文首发于唐霜的博客】ex,我们可以查询的能力被扩展到了任意属原创内容,盗版必究。未经授权,禁止复制转载。性路径。

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net

和 objectStore 不同,ind【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。ex 的同一个 key 可以存在多个,因【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net为不同的存入值的某个 keyPath 可原创内容,盗版必究。【本文首发于唐霜的博客】能存在相同的值。

转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。【本文受版权保护】【版权所有】唐霜 www.tangshuang.net

如何创建索引?【版权所有】唐霜 www.tangshuang.net

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】【转载请注明来源】

创建索引这个动作,实际上是对 objec【本文首发于唐霜的博客】【本文受版权保护】tStore 进行修改,因此,只能在 d原创内容,盗版必究。转载请注明出处:www.tangshuang.netb 的 onupgradeneeded 事件中处【转载请注明来源】原创内容,盗版必究。理。

本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【原创不易,请尊重版权】
let request = window.indexedDB.open('mydb', 1)
request.onupgradeneeded = e => {
  let db = e.target.result
  let objectStore = db.createObjectStore('mystore', { keyPath: 'id' }) //注意这里应该进行判断是否已经存在这个 objectStore,我是为了省事
  objectStore.createIndex('price', 'book.price', { unique: false })
}

objectStore 对象有一个 cr【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】eateIndex 方法,它可以创建索引【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】。它有三个参数,第一个参数是这个索引的 原创内容,盗版必究。【作者:唐霜】indexName,第二个参数是 key【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】Path,第三个参数是 options,本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。其中 unique 选项被放在这里面。

【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】

如何修改索引?未经授权,禁止复制转载。

【原创内容,转载请注明出处】【本文受版权保护】【关注微信公众号:wwwtangshuangnet】

虽然 objectStore 本身的信息【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。是不能修改的,比如 name 和 key【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.netPath 都是不能修改的,但是它所拥有的【本文受版权保护】著作权归作者所有,禁止商业用途转载。索引可以被修改,修改其实就是删除+添加操【版权所有,侵权必究】【作者:唐霜】作。用到的就是 deleteIndex 【本文受版权保护】原创内容,盗版必究。这个方法,所以,如果你想修改一个索引,要【原创内容,转载请注明出处】【作者:唐霜】做的就是先删除掉原来的同名索引,然后添加本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】新的索引。举个例子,如果你知道数据库中已【版权所有,侵权必究】转载请注明出处:www.tangshuang.net经存在 mystore 这个 objec转载请注明出处:www.tangshuang.net【未经授权禁止转载】tStore 了:

【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。原创内容,盗版必究。
request.onupgradeneeded = (e) => {
  const objectStore = e.target.transaction.objectStore('mystore')
  const indexNames = objectStore.indexNames
  if (indexNames.contains('name')) {
    objectStore.deleteIndex('name')
  }
  objectStore.createIndex('name', 'name', { unique: false })
}

上面这段代码通过对已有的 objectS本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。tore 的 index 进行操作,如果【原创不易,请尊重版权】【原创内容,转载请注明出处】存在某个 index 时,就删除它再添加本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】,如果没有就直接添加。

【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【本文受版权保护】

索引的运行机制原创内容,盗版必究。

本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【未经授权禁止转载】

indexName 是对一个索引的命名,本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】这个名字会被用在按索引检索中,它本身和使【本文首发于唐霜的博客】未经授权,禁止复制转载。用被存储数据的那个属性路径没关系,但你可【未经授权禁止转载】【作者:唐霜】以把它当做是一个别名。

【版权所有】唐霜 www.tangshuang.net【作者:唐霜】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。

例如,你在创建索引的时候,是这样创建的:

【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】
objectStore.createIndex('indexName', 'index.keyPath', { unique: false })

在根据索引进行查询的时候,语法是这样的:

本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】【作者:唐霜】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。
const request = objectStore.index('indexName').get('indexKey')

这实际上是两个过程,第一个过程是在保存数著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。据时(包括创建和更新),索引区会同步更新【本文受版权保护】【转载请注明来源】自己的 key,它包含如下步骤:

转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。原创内容,盗版必究。

第二个过程是查询过程,【作者:唐霜】.index('indexName') 这个动作就是从名字为 indexNam【转载请注明来源】【关注微信公众号:wwwtangshuangnet】e 的索引区去进行索引查询,.get('indexKey') 这个动作包含了好几步:【转载请注明来源】

原创内容,盗版必究。【本文受版权保护】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。

从某种意义上讲,索引查询的性能肯定不如直【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】接通过 objectStore 的 ke【原创不易,请尊重版权】【转载请注明来源】y 查询。

本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【转载请注明来源】本文作者:唐霜,转载请注明出处。

[1]【版权所有,侵权必究】 在索引中,存在一个叫 【访问 www.tangshuang.net 获取更多精彩内容】referenced value本文作者:唐霜,转载请注明出处。 的东西,即一个索引建立的时候,会自动引【原创不易,请尊重版权】【转载请注明来源】用 objectStore 中对应的记录【转载请注明来源】著作权归作者所有,禁止商业用途转载。。所以,对于开发者,不用担心索引是如何去【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。快速找到它在 objectStore 的【本文首发于唐霜的博客】原创内容,盗版必究。对应记录的。

转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

什么是 unique?未经授权,禁止复制转载。

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】

默认情况下,index 的 key 是可【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。以重复的。所有的值被存在 objectS原创内容,盗版必究。【作者:唐霜】tore 中,但是所有值除了 objec未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】tStore 中规定的 keyPath 【本文首发于唐霜的博客】【原创不易,请尊重版权】必须唯一之外,默认情况下,其他属性可以相【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】同。但是,如果你建立的索引传入了 uni【转载请注明来源】转载请注明出处:www.tangshuang.netque 参数,那么情况就会发生变化。也就【本文受版权保护】【原创不易,请尊重版权】是说,该索引的 keyPath 被用于检本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。查存入的值对应的 keyPath 是否已【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。经有值,如果 objectStore 中【未经授权禁止转载】本文作者:唐霜,转载请注明出处。存在该 keyPath 的值为将要存入的【原创不易,请尊重版权】【未经授权禁止转载】值的该 keyPath 值,那么会抛出错未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】误。

著作权归作者所有,禁止商业用途转载。【转载请注明来源】本文版权归作者所有,未经授权不得转载。

transaction【访问 www.tangshuang.net 获取更多精彩内容】

【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】

所有结构完备的数据库中都有“事务”这个概【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】念,它是为了确保当并非执行某些操作时,不【转载请注明来源】【关注微信公众号:wwwtangshuangnet】致混乱。举个简单的例子,当你在像好友打钱【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】的时候,发起了一个请求,这个请求发起后,未经授权,禁止复制转载。【原创内容,转载请注明出处】就建立了你打钱的事务,后面一大堆数据库写【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。入的操作,但是,假如中间突然机房停电,银转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】行系统发生故障,你又发起了第二个打钱的请本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】求,那么会不会有这样一种可能,你第一次打原创内容,盗版必究。【转载请注明来源】出去的钱你朋友根本没收到?数据库系统为了【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。避免这种情况,采用事务机制,如果出错,那著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】就回滚,把你打出去但对方没收到的钱回到你本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。账上,重新再执行一次打钱的操作,执行完这【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】个操作之后,再执行你第二次打钱的操作。这【转载请注明来源】【关注微信公众号:wwwtangshuangnet】样就保证了数据库增删改有序不混乱。

转载请注明出处:www.tangshuang.net原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】【作者:唐霜】

什么是 transaction?【原创不易,请尊重版权】

【未经授权禁止转载】未经授权,禁止复制转载。【未经授权禁止转载】【原创内容,转载请注明出处】【转载请注明来源】

indexedDB 里面的事务,保证了所【原创内容,转载请注明出处】【作者:唐霜】有操作(特别是写入操作)是按照一定的顺序【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。进行,不会导致同时写入的问题。另外,in【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.netdexedDB 里面,强制规定了,任何读转载请注明出处:www.tangshuang.net【未经授权禁止转载】写操作,都必须在一个事务中进行。从前面的未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。代码里面你也看到了,对 objectSt原创内容,盗版必究。转载请注明出处:www.tangshuang.netore 的修改,其实也是在一个事务中进行原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】

【转载请注明来源】转载请注明出处:www.tangshuang.net原创内容,盗版必究。

特别是写操作,事务通过尝试性写入完成第一转载请注明出处:www.tangshuang.net【转载请注明来源】步更新,如果整个尝试过程没有出错,那么会【作者:唐霜】【版权所有,侵权必究】通过一个 commit 操作使得整个更新转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】生效。但是如果在尝试过程中出错了,就会进未经授权,禁止复制转载。【作者:唐霜】行一个 abort 操作,之前做过的尝试【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】会直接被丢弃,数据不会发生改变。一个 o本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】bjectStore 的写入过程中,另外原创内容,盗版必究。原创内容,盗版必究。一个写入操作会被挂起,直到上一个事务完成【原创内容,转载请注明出处】【作者:唐霜】

未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net

如何使用 transaction?【本文受版权保护】

【本文受版权保护】【转载请注明来源】转载请注明出处:www.tangshuang.net【本文受版权保护】【原创不易,请尊重版权】

在代码层面,我们必须通过 transac【本文受版权保护】【未经授权禁止转载】tion 方法,向数据库容器提出事务要求【未经授权禁止转载】【原创不易,请尊重版权】,才能往具体的 objectStore 著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。进行数据处理:

【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】【原创内容,转载请注明出处】
let transaction = db.transaction(['myObjectStore'], 'readonly')
let objectStore = transaction.objectStore('myObjectStore')
let request = objectStore.get('111')

上面这段代码的操作,我们得到了具体要进行【作者:唐霜】【原创不易,请尊重版权】操作的 objectStore,这和我们未经授权,禁止复制转载。未经授权,禁止复制转载。预期直接通过 db.objectStore('myObjectStore') 这样简洁的方法完全不同,indexed【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.netDB 中不能这么直接去获取 object【转载请注明来源】【原创内容,转载请注明出处】Store,而必须通过 transact【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】ion。

【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

transaction 方法有两个参数:

本文版权归作者所有,未经授权不得转载。【转载请注明来源】【版权所有,侵权必究】【转载请注明来源】

而通过 transaction 的 ob【原创内容,转载请注明出处】【本文首发于唐霜的博客】jectStore 方法可以获取想要操作【关注微信公众号:wwwtangshuangnet】【作者:唐霜】的 objectStore,但是它的参数本文作者:唐霜,转载请注明出处。原创内容,盗版必究。必须存在于上面的 objectStore原创内容,盗版必究。未经授权,禁止复制转载。s 数组中,毕竟你的这个事务已经规定了要【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。对哪些 objectStore 进行操作【版权所有】唐霜 www.tangshuang.net【作者:唐霜】

著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

因为 objectStore 是在事务中【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net获取,因此一个 objectStore 转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】实例,如果有一个 transaction【作者:唐霜】本文作者:唐霜,转载请注明出处。 属性的话,那么可以通过这个属性找出它的【原创内容,转载请注明出处】原创内容,盗版必究。事务的实例。在 indexedDB 中,本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net你只能在事务中得到一个 objectSt【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】ore 实例,如果通过 db 的话,最多【原创内容,转载请注明出处】【转载请注明来源】只能得到 objectStore 的名字【作者:唐霜】本文版权归作者所有,未经授权不得转载。列表,要获得 objectStore 的【原创不易,请尊重版权】【未经授权禁止转载】实例,必须在 transaction 中【版权所有,侵权必究】【转载请注明来源】

原创内容,盗版必究。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】

补充:由于js是单线程运行程序,所以对于转载请注明出处:www.tangshuang.net【本文受版权保护】所有事务而言,也是有先后顺序的,只有当某【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。些事务完成之后,才会进入后面当事务,因此【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】即使一个 objectStore 存在于【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】多个事务中,它也会按照事务出现当先后顺序【作者:唐霜】【未经授权禁止转载】被操作,而不是被不同当事务交叉操作。另外本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】,对一个 objectStore 的写入原创内容,盗版必究。原创内容,盗版必究。操作的事务只允许存在一个,它会自动根据你本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。传入的 mode 值为 readwrit转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。e 时进行判断和报错。

【未经授权禁止转载】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】【原创内容,转载请注明出处】
【本文首发于唐霜的博客】未经授权,禁止复制转载。【原创内容,转载请注明出处】

事务生命周期【未经授权禁止转载】

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。

知道有事务的存在之后,本文版权归作者所有,未经授权不得转载。一定要注意 indexedDB 事务的生原创内容,盗版必究。【作者:唐霜】命周期。一个事务,它会把你在它的生命周期里面规著作权归作者所有,禁止商业用途转载。【转载请注明来源】定的操作全部执行,一旦执行完,周期结束,本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net那么事务就关闭了,你不能再利用这个事务的【本文首发于唐霜的博客】【原创不易,请尊重版权】实例进行下一步操作。

【转载请注明来源】【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。【作者:唐霜】转载请注明出处:www.tangshuang.net

举一个错误的例子:【版权所有,侵权必究】

【原创内容,转载请注明出处】【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】
var tx
var objectStore
var request = indexedDB.open('name', 1)
requst.onsuccess = function(e) {
  var db = e.target.result
  tx = db.transaction(["MyOBJ"],"readwrite")
  objectStore = tx.objectStore("MyOBJ")
}
btn.onclick = function() {
  objectStore.add({}) // 这时会报错,因为生命周期已经结束了,你不能在这里使用 tx 或 objectStore
}

上面灰色的代码是一个错误的使用思路。写代【未经授权禁止转载】【未经授权禁止转载】码的人想在全局某个地方创建了一个事务,并【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。用一个变量保存起来,好在后续操作中使用。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。但是,indexedDB 中,事务会在非【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。常短的时间里面循环检查自己,当发现自己内本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。部已经没有任何任务要做的时候,就将自己关本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net闭。要深入了解这一点,你需要了解 jav【原创不易,请尊重版权】【原创内容,转载请注明出处】ascript 调用栈、事件循环的知识,原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net可能有点复杂。

【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。

总之,你可以把 indexedDB 里面【版权所有,侵权必究】【版权所有,侵权必究】的事件想象成时间非常短(1ms)的 de转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netbounce,如果在这个 1ms 里面,【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】没有新的任务要做,它就关闭了,不能再被使原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net用。所以,上面正确的代码应该是:

【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。
btn.onclick = function() {
  var request = indexedDB.open('name', 1)
  requst.onsuccess = function(e) {
    var db = e.target.result
    var tx = db.transaction(["MyOBJ"],"readwrite")
    var objectStore = tx.objectStore("MyOBJ")
    var request = objectStore.add({ ... })
  }
}

即在每一次发生 click 事件的时候去【转载请注明来源】【关注微信公众号:wwwtangshuangnet】发起一个事务,再在这个事务中搞事情。

【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【原创内容,转载请注明出处】

什么是 request?【本文受版权保护】

【原创内容,转载请注明出处】【作者:唐霜】【原创内容,转载请注明出处】

我们操作数据,一定是在事务中进行。一个事转载请注明出处:www.tangshuang.net【转载请注明来源】务,本质上是控制一个生命周期,用于保证数【转载请注明来源】【本文首发于唐霜的博客】据库读写的可用和安全。但是,真正涉及到如【版权所有,侵权必究】原创内容,盗版必究。何去存取数据,我们需要发起一个 requ【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】est。一个事务过程中,可以有多个 re【版权所有】唐霜 www.tangshuang.net【本文受版权保护】quest,request 一定存在与事未经授权,禁止复制转载。原创内容,盗版必究。务中,因此它肯定会有一个 transac【作者:唐霜】著作权归作者所有,禁止商业用途转载。tion 属性来获取它所属于的那个事务的【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】容器。

原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net

为什么要有 request 呢?你可以把【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。 transaction 当做一个队列,本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】在这个队列中,request 在进行排队【本文首发于唐霜的博客】【转载请注明来源】,每一个 request 都只包含一个操【原创内容,转载请注明出处】原创内容,盗版必究。作,比如添加,修改,删除之类的。这些操作转载请注明出处:www.tangshuang.net【本文受版权保护】不能马上进行,比如修改操作,如果你马上进【作者:唐霜】本文版权归作者所有,未经授权不得转载。行,就会导致大家同时修改怎么办的问题,把转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】多个修改操作放在 request 中,这【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。些 request 在 transact转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】ion 中排队,一个一个处理,这样就会有【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】执行的顺序,修改就有前后之分。同时,tr本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】ansaction 都可以被 abort【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net,这样当一系列的操作被放弃之后,后续的操【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】作也不会进行。

原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net

而且非常重要的思想是,request 是原创内容,盗版必究。【未经授权禁止转载】异步的,它有状态,一个 request 【本文受版权保护】【版权所有】唐霜 www.tangshuang.net处于什么状态,可以通过 readyStates 属性查到,这对开发者而言也更可控。【本文首发于唐霜的博客】

【本文受版权保护】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】

目前,在 indexedDB 中,有四种【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】可能产生 request:open da【版权所有,侵权必究】未经授权,禁止复制转载。tabase,objectStore r【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。equest, cursor reque【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】st, index request。

【原创内容,转载请注明出处】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net

cursor未经授权,禁止复制转载。

本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】未经授权,禁止复制转载。

虽然 indexedDB 使用 obje未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.netctStore 存储数据,是一个 key转载请注明出处:www.tangshuang.net原创内容,盗版必究。-value 数据库。但是,我们有遍历所转载请注明出处:www.tangshuang.net【未经授权禁止转载】有记录的需求。cursor 游标,就是 【作者:唐霜】【原创内容,转载请注明出处】indexedDB 提供的遍历整个 ob【版权所有】唐霜 www.tangshuang.net【本文受版权保护】jectStore 的能力接口。

未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。

什么是 cursor?原创内容,盗版必究。

【作者:唐霜】【原创不易,请尊重版权】【未经授权禁止转载】原创内容,盗版必究。

概念上讲,游标是“一个用来记录数组正在被【本文首发于唐霜的博客】【原创不易,请尊重版权】操作的某个下标位置的迭代器”。举个例子,【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。你有一个数组 [1,2,3,4],现在你【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】要对它进行遍历,使用 forEach 方未经授权,禁止复制转载。未经授权,禁止复制转载。法,那么 forEach 方法怎么知道你转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。上次操作到第几个元素,现在应该操作第几个本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。元素呢?它通过内部的一个迭代器实现。游标【作者:唐霜】【未经授权禁止转载】本质上是一个迭代器,也就意味着有类似于 【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】next 的方法,可以用来移动游标到下一【转载请注明来源】未经授权,禁止复制转载。个位置,有 value 属性用来读取当前【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】值。当然,游标不能理解为纯粹的迭代器,因【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】为它的内部过程需要进行 I/O 操作。

本文版权归作者所有,未经授权不得转载。【本文受版权保护】【本文受版权保护】【未经授权禁止转载】

获取全部 object【原创内容,转载请注明出处】

转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。原创内容,盗版必究。

想要获取一个 objectStore 中【未经授权禁止转载】【原创不易,请尊重版权】的全部 object 可不是一件简单的事本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】。indexedDB 1.0 版本的时候【本文受版权保护】著作权归作者所有,禁止商业用途转载。没有直接提供类似的方法来获取(2.0 已转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。经提供了 getAll 方法)。那么我们【本文受版权保护】未经授权,禁止复制转载。应该怎么办呢?利用游标。

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【转载请注明来源】本文作者:唐霜,转载请注明出处。
let transaction = db.transaction(['myObjectStore'], 'readonly')
let objectStore = transaction.objectStore('myObjectStore')
let request = objectStore.openCursor()
let results = []
request.onsuccess = e => {
  let cursor = e.target.result
  if (cursor) {
    results.push(cursor.value)
    cursor.continue()
  }
  else {
    // 所有的object都在results里面
  }
}

通过 openCursor 方法开启一个著作权归作者所有,禁止商业用途转载。【转载请注明来源】游标,在其 onsuccess 事件中,原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。如果 cursor 没有遍历完所记录,那【作者:唐霜】【原创不易,请尊重版权】么通过执行 cursor.continu【版权所有,侵权必究】转载请注明出处:www.tangshuang.nete() 来让游标滑动到下一个记录,ons未经授权,禁止复制转载。【未经授权禁止转载】ucess 会被再次触发。而如果所有记录原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。都遍历完了,cursor 变量会是 un【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】defined。

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【本文受版权保护】

注意上面蓝色的 results,它的声明【作者:唐霜】本文作者:唐霜,转载请注明出处。必须放在 onsuccess 回调函数的转载请注明出处:www.tangshuang.net原创内容,盗版必究。外部,因为该回调函数会在遍历过程中反复执本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。行。

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】

通过 index 查询集合【作者:唐霜】

本文作者:唐霜,转载请注明出处。【转载请注明来源】未经授权,禁止复制转载。【作者:唐霜】【原创内容,转载请注明出处】

前文举例过如何通过 index 查询值。【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。但是,在前面的演示代码中,仍然只能得到一未经授权,禁止复制转载。原创内容,盗版必究。个值,加入我们希望通过 index 得到原创内容,盗版必究。【原创不易,请尊重版权】某个 index key 的所有值呢?通【本文受版权保护】本文作者:唐霜,转载请注明出处。过游标就可以实现。

【作者:唐霜】【本文受版权保护】本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】
let objectStore = db.transaction([storeName], 'readonly').objectStore(storeName)
let objectIndex = objectStore.index('name')
let request = objectIndex.openCursor()
request.onsuccess = e => {
  let cursor = e.target.result
  if (cursor) {
    results.push(cursor.value)
    cursor.continue()
  }
  else {
    // 所有的 object 都在 results 里面
  }
}

你可以发现,整个操作跟前面的获取所有 o原创内容,盗版必究。原创内容,盗版必究。bject 几乎一样,只不过这里先得到了未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。 index。

【转载请注明来源】【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

你也可以总结出游标的使用,简单的说,就是未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】对已知的集合对象(比如 objectSt【本文受版权保护】本文作者:唐霜,转载请注明出处。ore 或 index)进行遍历,在 o【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。nsuccess 中使用 continu【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。e 来进行控制。

未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

数据的存取【关注微信公众号:wwwtangshuangnet】

本文版权归作者所有,未经授权不得转载。【本文受版权保护】【本文首发于唐霜的博客】

当一个事务开始之后,在它的生命周期以内,未经授权,禁止复制转载。【原创内容,转载请注明出处】你可以对 objectStore 进行数未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net据操作,数据操作无非是增删改查。前面介绍【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。过如何获取事务中的objectStore【未经授权禁止转载】未经授权,禁止复制转载。,现在,我们就用获取到的objectSt【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】ore进行数据操作。

【本文首发于唐霜的博客】原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。【原创内容,转载请注明出处】

获取数据【访问 www.tangshuang.net 获取更多精彩内容】

原创内容,盗版必究。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】
let transaction = db.transaction(['myObjectStore'], 'readonly')
let objectStore = transaction.objectStore('myObjectStore')
let request = objectStore.get('100001')
request.onsuccess = e => {
  let obj = e.target.result
}

的确,在indexedDB事务机制下进行【本文首发于唐霜的博客】【原创不易,请尊重版权】操作是很麻烦的,上面代码中我们使用了ge【原创不易,请尊重版权】【本文首发于唐霜的博客】t方法获取主键值为100001的obje本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ct,但是获取过程是一个Request,本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。后文会详细讲Request是什么东东,只【作者:唐霜】【版权所有】唐霜 www.tangshuang.net有在其onsuccess事件中才能得到获本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net取到的结果。

【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【转载请注明来源】

添加数据【原创不易,请尊重版权】

【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。
let transaction = db.transaction(['myObjectStore'], 'readonly')
let objectStore = transaction.objectStore('myObjectStore')
let request = objectStore.add({
  id: '100002',
  name: 'Zhang Fei',
})

添加数据使用add方法,传入一个obje【版权所有】唐霜 www.tangshuang.net【本文受版权保护】ct。但是这个object有限制,它的主原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net键值,也就是id值,不能是已存在的,如果未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】objectStore中已经有了这个id原创内容,盗版必究。【作者:唐霜】,那么会报错。因此,在某些程序中,为了避【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】免这种情况的发生,我们使用put方法。

【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】

更新数据【本文首发于唐霜的博客】

【版权所有,侵权必究】【版权所有,侵权必究】原创内容,盗版必究。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。
let transaction = db.transaction(['myObjectStore'], 'readonly')
let objectStore = transaction.objectStore('myObjectStore')
let request = objectStore.put({
 id: '100002',
 name: 'Zhang Fei',
})

put方法和add方法有两大区别。一,如【原创内容,转载请注明出处】【未经授权禁止转载】果objectStore中已经有了该id【作者:唐霜】未经授权,禁止复制转载。,则表示更新这个object,如果没有,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】则添加这个object。二,在另一种情况原创内容,盗版必究。未经授权,禁止复制转载。下,也就是设置了autoIncremen转载请注明出处:www.tangshuang.net【转载请注明来源】t为true的时候,也就是主键自增的时候【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】,put方法必须传第二个参数,第二个参数【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。是主键的值,以此来确定你要更新的是哪一个【本文受版权保护】【本文受版权保护】主键对应的object,如果不传的话,可【原创内容,转载请注明出处】【本文受版权保护】能会直接增加一个object到数据库中。原创内容,盗版必究。【原创内容,转载请注明出处】从这一点上讲,自增字段确实比较难把握,因著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。此我建议开发者严格自己在传入时保证obj【转载请注明来源】【原创内容,转载请注明出处】ect中存在主键值。

【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【未经授权禁止转载】

删除数据【版权所有,侵权必究】

【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】【未经授权禁止转载】
let transaction = db.transaction(['myObjectStore'], 'readonly')
let objectStore = transaction.objectStore('myObjectStore')
let request = objectStore.delete('100001')

delete方法把你传入的主键值对应的o【关注微信公众号:wwwtangshuangnet】【转载请注明来源】bject从数据库中删除。

【转载请注明来源】【本文受版权保护】本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。

IndexedDB API【未经授权禁止转载】

转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。

本节主要把indexedDB中最常用的所【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。有api进行列举,起到快速查阅的作用。注本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。意,这里仅是最常用,基本可以覆盖90%的未经授权,禁止复制转载。原创内容,盗版必究。使用场景,但并不代表所有的api都在这里【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】,你可以通过这里本文作者:唐霜,转载请注明出处。查阅全部。【原创不易,请尊重版权】

原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】

I【版权所有】唐霜 www.tangshuang.netD【版权所有,侵权必究】B本文版权归作者所有,未经授权不得转载。Database【版权所有,侵权必究】

【原创内容,转载请注明出处】【本文受版权保护】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。

也就是本文最开始使用open打开inde【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。xedBD得到的db对象db,通过这节,了解这个idb有些什么接口可本文版权归作者所有,未经授权不得转载。【转载请注明来源】以被调用。

著作权归作者所有,禁止商业用途转载。【转载请注明来源】【原创内容,转载请注明出处】
let request = indexedDB.open(name, version)
request.onsuccess = (e) => {
  let db = e.target.result // 获得db
}

name【关注微信公众号:wwwtangshuangnet】

【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。未经授权,禁止复制转载。【本文受版权保护】

通过idb.name获取当前连接到的数据【未经授权禁止转载】转载请注明出处:www.tangshuang.net库的名字。这和你在open的时候传入的n本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netame是一致的。

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】

version原创内容,盗版必究。

【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。

和你在open的时候传入的version【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】是一致的。

未经授权,禁止复制转载。【版权所有,侵权必究】【未经授权禁止转载】

objectStoreNames未经授权,禁止复制转载。

【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。

获取当前数据库的所有objectStor转载请注明出处:www.tangshuang.net【未经授权禁止转载】e的name列表,是一个数组。

【未经授权禁止转载】原创内容,盗版必究。【原创不易,请尊重版权】

createObjectStore()本文作者:唐霜,转载请注明出处。

【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

创建一个objectStore,有两个参【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】数:

【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

例子:【转载请注明来源】

著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。
db.createObjectStore('students', { keyPaht: 'id', autoIncrement: false })

deleteObjectStore()转载请注明出处:www.tangshuang.net

【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。

删除一个objectStore,参数只有本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。一个:

原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】

删除的时候,它的所有index也被删除了本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。

【本文受版权保护】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

close()原创内容,盗版必究。

【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【转载请注明来源】

关闭当前打开的这个数据库。关闭之后,任何【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】操作都会报错。

【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】

transaction()【版权所有】唐霜 www.tangshuang.net

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】

重头戏,开启一个事务,是后续操作的开始。【转载请注明来源】著作权归作者所有,禁止商业用途转载。前文已经讲过了,任何操作都是要在事务中进本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】行的,对于一个database而言,如果【版权所有】唐霜 www.tangshuang.net【本文受版权保护】要获取里面的数据,或者修改其中的某一个o【转载请注明来源】【版权所有,侵权必究】bjectStore,都要通过这个方法来【未经授权禁止转载】本文作者:唐霜,转载请注明出处。开启一个事务,在事务中进行操作。

【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

它有两个参数:【原创内容,转载请注明出处】

原创内容,盗版必究。【原创内容,转载请注明出处】【作者:唐霜】

我们用代码来看下用法:【原创内容,转载请注明出处】

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。
let tx = idb.transaction(['students'], 'readonly')

这样就获得了一个database的事务容【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。器。

【转载请注明来源】【转载请注明来源】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net

database的api主要用到的就这些未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net了,接下来,我们来看下,开启事务之后,我【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net们可以干什么。

著作权归作者所有,禁止商业用途转载。【作者:唐霜】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。

I【本文受版权保护】D本文作者:唐霜,转载请注明出处。B未经授权,禁止复制转载。Transaction本文版权归作者所有,未经授权不得转载。

【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。

关于transaction的概念前面已经【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。说了,这里主要看下,得到一个transa【本文受版权保护】未经授权,禁止复制转载。ction之后可以干什么。

本文作者:唐霜,转载请注明出处。【作者:唐霜】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【作者:唐霜】

db【版权所有】唐霜 www.tangshuang.net

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【未经授权禁止转载】【未经授权禁止转载】

获取这个transaction是对哪个d本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】atabase进行操作的事务。

【本文受版权保护】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。

objectStoreNames【版权所有,侵权必究】

【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【未经授权禁止转载】

这个事务要对哪些objectStore进【作者:唐霜】原创内容,盗版必究。行操作,和你传入的objectStore【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】Names是一致的,是一个数组。

【原创不易,请尊重版权】【未经授权禁止转载】【版权所有,侵权必究】

mode【访问 www.tangshuang.net 获取更多精彩内容】

本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】

读写权限,和你传入的mode一致。【原创不易,请尊重版权】

【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【转载请注明来源】

abort()本文作者:唐霜,转载请注明出处。

【原创内容,转载请注明出处】【本文受版权保护】【转载请注明来源】

终止该事务,一旦人为终止,你程序中的某些【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】操作就不会再执行了。

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】【本文受版权保护】

objectStore()【版权所有】唐霜 www.tangshuang.net

【原创不易,请尊重版权】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

获取事务中的某个objectStore的【本文受版权保护】著作权归作者所有,禁止商业用途转载。容器。它有一个参数:

著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【版权所有,侵权必究】

获得该objectStore容器之后,就【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】可以利用它进行objectStore的数未经授权,禁止复制转载。【未经授权禁止转载】据增删改查了。

【作者:唐霜】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】原创内容,盗版必究。【原创内容,转载请注明出处】
let tx = idb.transaction(['students'], 'readonly')
let objStore = tx.objectStore('students')

// 利用objStore进行查询:
let request = objStore.get('100001')

注意,它的参数必须是在transacti【本文受版权保护】【关注微信公众号:wwwtangshuangnet】on的第一个参数数组中的。

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。

I【版权所有】唐霜 www.tangshuang.netD本文版权归作者所有,未经授权不得转载。B转载请注明出处:www.tangshuang.netObject未经授权,禁止复制转载。Store【版权所有】唐霜 www.tangshuang.net

【本文首发于唐霜的博客】【作者:唐霜】转载请注明出处:www.tangshuang.net【作者:唐霜】原创内容,盗版必究。

重头戏,objectStore是最核心的未经授权,禁止复制转载。未经授权,禁止复制转载。概念了,它的容器,也就是上面这段代码中的objStore,都可以进行哪些后续操作呢?本文作者:唐霜,转载请注明出处。

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【未经授权禁止转载】

name本文作者:唐霜,转载请注明出处。

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【原创不易,请尊重版权】

获取该objectStore的name。【本文首发于唐霜的博客】原创内容,盗版必究。和创建的时候传入的name一致。

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】

keyPath【访问 www.tangshuang.net 获取更多精彩内容】

【原创不易,请尊重版权】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。

和创建的时候传入的keyPath一致。【未经授权禁止转载】

【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】【原创内容,转载请注明出处】

autoIncrement【原创内容,转载请注明出处】

本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

和创建的时候传入的autoIncreme【原创内容,转载请注明出处】【版权所有,侵权必究】nt一致。

转载请注明出处:www.tangshuang.net【本文受版权保护】【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。

indexNames本文作者:唐霜,转载请注明出处。

【版权所有】唐霜 www.tangshuang.net【本文受版权保护】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】

获取该objectStore的所有索引的【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net命名列表,和createIndex传入的【原创内容,转载请注明出处】未经授权,禁止复制转载。第一个参数一致。

【原创不易,请尊重版权】【版权所有,侵权必究】【原创不易,请尊重版权】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

transaction未经授权,禁止复制转载。

【原创不易,请尊重版权】原创内容,盗版必究。【原创内容,转载请注明出处】【版权所有,侵权必究】【转载请注明来源】

获取该objectStore所属的tra【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。nsaction的容器。一个object转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。Store的容器,只有在事务中才能得到,本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。因此这个objectStore的容器一定本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net属于某个事务,那么也就有对应的trans【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。action容器。通过transacti【版权所有,侵权必究】【转载请注明来源】on容器,其实可以做很多操作,比如获取和著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】该objectStore一起操作的其他o转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。bjectStore的name。

【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】【本文首发于唐霜的博客】

get()本文版权归作者所有,未经授权不得转载。

【本文受版权保护】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【本文首发于唐霜的博客】

发起一个获取object的Request著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。。Request我们还没有讲到,后面会讲本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。。它有一个参数:

原创内容,盗版必究。【转载请注明来源】本文作者:唐霜,转载请注明出处。

代码说话:转载请注明出处:www.tangshuang.net

本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】
let objStore = tx.objectStore('students')
let request = objStore.get(100001)

而要得到最后查询到的object,需要在原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netrequest的onsuccess中获取原创内容,盗版必究。【本文首发于唐霜的博客】。所以后面讲完Request之后,你就能未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。正确使用代码了。

【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。原创内容,盗版必究。

add()【未经授权禁止转载】

【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net

发起一个添加object的Request【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】。它有一个参数:

【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】

还是用代码来看下:【原创不易,请尊重版权】

【版权所有,侵权必究】【转载请注明来源】【本文受版权保护】
let objStore = tx.objectStore('students')
let request = objStore.add({
  id: '100002',
  name: 'Li Hua',
})

delete()【版权所有】唐霜 www.tangshuang.net

【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】【原创不易,请尊重版权】

发起一个删除object的Request转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】。它有一个参数:

【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【作者:唐霜】

put()转载请注明出处:www.tangshuang.net

【原创不易,请尊重版权】未经授权,禁止复制转载。【作者:唐霜】

发起一个更新某个object的Reque【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】st。它有两个参数:

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。

关于key非常难理解。当你在创建一个ob【转载请注明来源】本文作者:唐霜,转载请注明出处。jectStore的时候,你可能会传入a【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。utoIncrement为true,这时【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。,这个objectStore和我们经常使著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。用的有点不同。比如你的主键是id,那么如本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。果你在add或put的时候,不传这个id【作者:唐霜】【本文受版权保护】,id值会自动加1,你get到的obje转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。ct也会包含id属性。

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net

当你在使用put方法去更新的时候,如果你【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net的objectStore的autoInc【原创内容,转载请注明出处】【版权所有,侵权必究】rement是true,就必须传入第二个转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net参数key,put方法会先通过key找到【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】该object,然后在用object的内原创内容,盗版必究。【版权所有,侵权必究】容去更新。而如果不传key,那么你传入的【本文受版权保护】【关注微信公众号:wwwtangshuangnet】第一个参数object中必须包含id,否著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。则会报错。
【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。 但是如果你的autoIncrement未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。设置的是false,那就可以考虑忽略ke【转载请注明来源】【本文首发于唐霜的博客】y。但是效果还是不一样,当你传入key值原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。的时候,会更新传入的key对应的那个ob【作者:唐霜】著作权归作者所有,禁止商业用途转载。ject。不传的时候,根据你object【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】里面的主键来更新,没有的话会被认为是ad【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。d操作,不会报错。

【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【本文受版权保护】

所以比较好的一种操作是,不设置autoI本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。ncrement,无论是添加还是修改ob【版权所有,侵权必究】【转载请注明来源】ject,都使用put,只要开发者自己注【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。意,传入的object一定要有一个主键即转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net可。这样当存在该主键值时,就更新,不存在【作者:唐霜】本文作者:唐霜,转载请注明出处。时就插入。这比使用add好很多,因为ad【关注微信公众号:wwwtangshuangnet】【作者:唐霜】d的时候,如果存在会报错。

著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】

如果你还有不理解的地方,欢迎在下方留言,【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】对这个问题进行探讨。

转载请注明出处:www.tangshuang.net原创内容,盗版必究。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。

count()原创内容,盗版必究。

原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。

没有参数,发起一个查询当前objectS本文作者:唐霜,转载请注明出处。原创内容,盗版必究。tore的所有object的数量的Req【作者:唐霜】【版权所有】唐霜 www.tangshuang.netuest。

【原创不易,请尊重版权】【本文首发于唐霜的博客】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net

clear()转载请注明出处:www.tangshuang.net

转载请注明出处:www.tangshuang.net【作者:唐霜】【版权所有】唐霜 www.tangshuang.net

没有参数,发起一个删除objectSto本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。re里面的所有object的Reques【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】t。

【转载请注明来源】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【原创不易,请尊重版权】

清除数据之前请备份好数据。原创内容,盗版必究。

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net

openCursor()本文作者:唐霜,转载请注明出处。

【转载请注明来源】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】

发起一个打开游标的Request。它的参【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。数统一在IDBCursor中讲。

【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【原创不易,请尊重版权】未经授权,禁止复制转载。未经授权,禁止复制转载。

index()本文版权归作者所有,未经授权不得转载。

本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】

通过index方法,可以建立一个类似SQ【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。L数据库中视图。它先得到一个IDBInd未经授权,禁止复制转载。【本文受版权保护】ex,然后你在对这个IDBIndex进行【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】操作。因此它不是发起一个Request,本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】这有别于前面的方法。返回的IDBInde【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.netx会在下文详细描述它的API。index【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】方法由一个参数:

【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】

看下代码怎么用:【访问 www.tangshuang.net 获取更多精彩内容】

未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】
let objStore = tx.objectStore('students')
let objIndex = objStore.index('name')
let request = objIndex.get('Li Hua')

createIndex()【访问 www.tangshuang.net 获取更多精彩内容】

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。

创建一个索引,和前面的方法不同,它不是发【原创内容,转载请注明出处】【未经授权禁止转载】起一个Request,而是直接进行操作,【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net并且返回一个IDBIndex。关于IDB【转载请注明来源】本文版权归作者所有,未经授权不得转载。Index,我会在Request后面再讲【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】。它有三个参数:

【作者:唐霜】【未经授权禁止转载】【原创内容,转载请注明出处】【作者:唐霜】

虽然objectParameters还有本文版权归作者所有,未经授权不得转载。【作者:唐霜】其他选项,但是常用的就是unique。

【本文首发于唐霜的博客】未经授权,禁止复制转载。【本文受版权保护】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net

注意,只能在onupgradeneede未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】d中使用。

【版权所有,侵权必究】未经授权,禁止复制转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net

deleteIndex()【本文首发于唐霜的博客】

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【原创内容,转载请注明出处】

删除一个索引,也不用发起Request。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。它有一个参数:

著作权归作者所有,禁止商业用途转载。【作者:唐霜】【原创不易,请尊重版权】

删除索引之后,就不能再根据索引查询数据了本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【转载请注明来源】

另外需要注意,创建和删除索引,都需要在打【原创内容,转载请注明出处】【原创不易,请尊重版权】开db的Request的onupgrad【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。eneeded事件中完成。

【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】

IDBRequest转载请注明出处:www.tangshuang.net

【转载请注明来源】【本文受版权保护】【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【本文受版权保护】

前面一直强调事务的概念,没有对Reque著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】st进行介绍。Request是在事务过程【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net中,发起某项操作的请求。一个事务过程中,著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net可以有多个Request,Request【转载请注明来源】著作权归作者所有,禁止商业用途转载。一定存在与事务中,因此它肯定会有一个tr【未经授权禁止转载】【作者:唐霜】ansaction属性来获取它所属于的那【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】个事务的容器。

【本文受版权保护】【本文受版权保护】转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net

目前,在indexedDB中,有四种可能【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。产生Request:open datab著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】ase,objectStore requ【作者:唐霜】著作权归作者所有,禁止商业用途转载。est, cursor request,转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net index request。

【作者:唐霜】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。

readyState【转载请注明来源】

【作者:唐霜】【本文受版权保护】【原创不易,请尊重版权】

Request的状态。只有两种状态:pe【原创不易,请尊重版权】未经授权,禁止复制转载。nding, done。

本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】

transaction原创内容,盗版必究。

转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

获取该Request所属于的transa【本文受版权保护】【版权所有,侵权必究】ction。

【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【本文首发于唐霜的博客】

source本文版权归作者所有,未经授权不得转载。

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。

获取该Request是由谁发起的,它可能转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。有四种情况:objStore, curs【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。or, index, null. 当该R著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】equest是open database【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。的时候发起,source值为null。

转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net

通过该source值,其实可以获取更多信【原创内容,转载请注明出处】原创内容,盗版必究。息,比如objectStore的其他信息【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】

原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

result【版权所有】唐霜 www.tangshuang.net

转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。

获取该Request的输出结果。该值最开未经授权,禁止复制转载。原创内容,盗版必究。始是undefined,只有当Reque【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。st成功之后,该值才会出现。因此,要获取本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。一个get的最终结果,必须在Reques原创内容,盗版必究。【原创内容,转载请注明出处】t的onsuccess事件中调用:

【原创不易,请尊重版权】【本文首发于唐霜的博客】未经授权,禁止复制转载。
let request = objectStore.get(10001)
request.onsuccess = e => {
  let item = request.result
  // 等价于
  let item = e.tareget.result
}

IDBIndex原创内容,盗版必究。

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【转载请注明来源】【原创不易,请尊重版权】

索引的概念就不讲了,这里主要是把最常用的本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net有关所有的api列举出来,方便使用。

【转载请注明来源】【本文首发于唐霜的博客】原创内容,盗版必究。

什么情况下会产生IDBIndex呢?当调【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net用一个objectStore的index著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】方法时,前文在讲IDBObjectSto著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。re的时候已经讲到过了。

【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】【作者:唐霜】【原创内容,转载请注明出处】
let objStore = tx.objectStore('students')
let objIndex = objStore.index('name')

通过index方法之后,这个objInd【转载请注明来源】原创内容,盗版必究。ex可以进行哪些操作呢?

【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【未经授权禁止转载】【作者:唐霜】

name【转载请注明来源】

【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】原创内容,盗版必究。

该属性可以获取index的name。【本文首发于唐霜的博客】

【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】

keyPath【本文受版权保护】

本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】

该属性可以获取index的keyPath未经授权,禁止复制转载。【原创不易,请尊重版权】,也就是object的某个属性的名字。这著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】个你在createIndex的时候传入的【本文首发于唐霜的博客】原创内容,盗版必究。keyPath是一致的。

本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。

unique本文版权归作者所有,未经授权不得转载。

【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

返回是否是唯一的,和你createInd转载请注明出处:www.tangshuang.net【未经授权禁止转载】ex的时候传入的值是一致的。

著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。

isAutoLocale未经授权,禁止复制转载。

【版权所有,侵权必究】【原创不易,请尊重版权】【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】

返回一个boolean值,它表示这个in本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.netdex是否是自增的,和前面的autoIn【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】crement有关。

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【本文受版权保护】未经授权,禁止复制转载。【本文受版权保护】

locale著作权归作者所有,禁止商业用途转载。

未经授权,禁止复制转载。未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【未经授权禁止转载】

如果这个index对应的字段是自增的,那转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net么现在的自增基础值是多少?比如你的id是本文版权归作者所有,未经授权不得转载。【转载请注明来源】自增的,现在objectStore里面有本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。10个object,这时objIndex【关注微信公众号:wwwtangshuangnet】【本文受版权保护】.locale应该是10.

未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】

objectStore原创内容,盗版必究。

【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。

因为IDBIndex总是通过object【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】Store的index方法产生的,所以它【转载请注明来源】著作权归作者所有,禁止商业用途转载。自然会有对应的那个objectStore转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】,而自己的objectStore属性正好【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。是一个引用,指向那个产生自己的objec本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。tStore。

本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【作者:唐霜】

count()著作权归作者所有,禁止商业用途转载。

【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。

发起一个当前index视图总共有多少个o【转载请注明来源】【转载请注明来源】bject的Request。

著作权归作者所有,禁止商业用途转载。【本文受版权保护】著作权归作者所有,禁止商业用途转载。

get()本文作者:唐霜,转载请注明出处。

【转载请注明来源】【本文首发于唐霜的博客】未经授权,禁止复制转载。【原创内容,转载请注明出处】

发起一个从当前index获取一个值为传入【关注微信公众号:wwwtangshuangnet】【本文受版权保护】参数的object的Request。它有转载请注明出处:www.tangshuang.net【版权所有,侵权必究】一个参数:

本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【本文受版权保护】

这里的key有点难理解,前面object【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。Store的get方法传入的是主键的值,【未经授权禁止转载】【原创内容,转载请注明出处】而这类的get传入的是你选择的这个索引对【未经授权禁止转载】【未经授权禁止转载】应的属性的值。比如说:

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】原创内容,盗版必究。
{
  id: 1,
  name: 'tom',
}

id是主键,name是一个索引。那么这个本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】时候,如果你想得到这个object,应该本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net使用:

【转载请注明来源】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。
let request = objIndex.get('tom') // 这个tom是name属性的值

openCursor()【转载请注明来源】

【未经授权禁止转载】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

发起一个打开游标的Request。它的参【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】数统一在IDBCursor中讲。

【本文受版权保护】【本文首发于唐霜的博客】原创内容,盗版必究。【作者:唐霜】

可以看出,objIndex对于objSt转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netore而言,方法少了很多,它不能更新、删【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。除等。但是实际上,通过objectSto本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。re属性,就可以反过来对objectSt【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】ore进行操作。

【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【原创不易,请尊重版权】未经授权,禁止复制转载。【原创内容,转载请注明出处】

IDBCursor【版权所有,侵权必究】

【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】

游标通过前文的阐述,应该比较容易理解了。【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。这里我们来看下,一个cursor都可以进本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net行哪些操作。

【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

但是在开始之前,你要回头看下游标是怎么得著作权归作者所有,禁止商业用途转载。【作者:唐霜】到的?

【原创不易,请尊重版权】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

openCursor()【未经授权禁止转载】

著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】未经授权,禁止复制转载。

objectStore或objectIn【未经授权禁止转载】【未经授权禁止转载】dex可以使用这个方法打开一个游标的Re【本文受版权保护】【版权所有】唐霜 www.tangshuang.netquest。它有两个参数:

未经授权,禁止复制转载。未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】

打开游标后,游标怎么获得呢?在Reque【作者:唐霜】本文作者:唐霜,转载请注明出处。st的onsuccess中得到的:

【作者:唐霜】【转载请注明来源】【转载请注明来源】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】
objStore.openCursor().onsuccess = e => {
  let cursor = e.target.result // 这个才是我们要的游标
}

接下来就是看看,这个cursor有哪些接【作者:唐霜】【版权所有】唐霜 www.tangshuang.net口。

【作者:唐霜】本文版权归作者所有,未经授权不得转载。【转载请注明来源】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。

direction【作者:唐霜】

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【作者:唐霜】【原创不易,请尊重版权】

游标遍历的方向,方向前面说过了,和你op未经授权,禁止复制转载。【未经授权禁止转载】enCursor的时候传入的是一致的。

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。

key【未经授权禁止转载】

【未经授权禁止转载】原创内容,盗版必究。转载请注明出处:www.tangshuang.net【转载请注明来源】

把当前游标所在的那个object的值返回本文作者:唐霜,转载请注明出处。【本文受版权保护】给你,这个值是你使用index方法时,选【未经授权禁止转载】【本文受版权保护】择的那个索引对应的属性的值。有点绕,举个本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。例子,如果游标当前停留在:

未经授权,禁止复制转载。【本文首发于唐霜的博客】【本文受版权保护】【本文首发于唐霜的博客】
{
  id: 2,
  name: 'sue',
}

而你开启这个游标,又是通过【原创内容,转载请注明出处】objStore.index('name').openCursor()开启的,那么这个时候这个key值,就是s未经授权,禁止复制转载。【版权所有,侵权必究】ue了。

著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【转载请注明来源】

primaryKey本文版权归作者所有,未经授权不得转载。

【关注微信公众号:wwwtangshuangnet】【作者:唐霜】【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】

游标遍历所在位置的object的主键。这【未经授权禁止转载】原创内容,盗版必究。个比较难理解,key和primaryKe【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。y的区别主要体现在你用索引进行检索的时候转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net,如果你openCursor是在非索引集原创内容,盗版必究。转载请注明出处:www.tangshuang.net合情况下,其实key和primaryKe未经授权,禁止复制转载。【原创内容,转载请注明出处】y是一样的,因为都是以主键作为索引。但是【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】当你用index方法筛选出子集,那么这个【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net时候primaryKey在某些情况下就非未经授权,禁止复制转载。未经授权,禁止复制转载。常有必要知道。

【未经授权禁止转载】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net

source原创内容,盗版必究。

【本文受版权保护】未经授权,禁止复制转载。未经授权,禁止复制转载。

该属性返回开启游标的容器的引用,也就是o【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netbjStore或objIndex。

原创内容,盗版必究。【本文受版权保护】【本文受版权保护】【作者:唐霜】【本文首发于唐霜的博客】

value【原创不易,请尊重版权】

未经授权,禁止复制转载。【版权所有,侵权必究】【转载请注明来源】未经授权,禁止复制转载。

改属性返回当前遍历到的object,严格【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】的说,这个属性是IDBCursorWithValue的属性。原创内容,盗版必究。

【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

continue()【作者:唐霜】

【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【本文受版权保护】【转载请注明来源】

游标往下移动一格或移动到你规定的位置。注【版权所有,侵权必究】【原创内容,转载请注明出处】意,它是根据你规定的方向进行移动的。它可【关注微信公众号:wwwtangshuangnet】【作者:唐霜】以有一个参数:

【转载请注明来源】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】

advance()著作权归作者所有,禁止商业用途转载。

【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】

continue()是只移动一格,adv著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。ance()可以自己规定移动的格数。它有【本文首发于唐霜的博客】【作者:唐霜】一个参数:

【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。

continuePrimaryKey()

【版权所有】唐霜 www.tangshuang.net【转载请注明来源】【原创不易,请尊重版权】

前面讲了primaryKey这个属性,也著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】讲了continue(key)这个方法的转载请注明出处:www.tangshuang.net【版权所有,侵权必究】参数key。但是,当你在openCurs【版权所有,侵权必究】原创内容,盗版必究。or的时候,索引的值可重复时,那就会出现【作者:唐霜】【本文首发于唐霜的博客】尴尬的情况。在objectStore里面【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。存储数据的时候,primaryKey和其未经授权,禁止复制转载。未经授权,禁止复制转载。他索引的key,它们的值可能是重复的,但【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。是如果通过两个key的值来确定呢?那么就【本文首发于唐霜的博客】【本文受版权保护】能更准确的定位某一个object。因此,【原创内容,转载请注明出处】【作者:唐霜】当你使用continuPrimaryKe转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】y的时候,是为了解决这个问题,即cont【原创内容,转载请注明出处】【版权所有,侵权必究】inue()只会根据参数,往下移动到下一【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net个给定参数值的object,而如果使用c本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netontinuePrimaryKey(),【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net那么在往下一个给定值移动时,还会再考虑p【转载请注明来源】原创内容,盗版必究。rimaryKey的值。

本文作者:唐霜,转载请注明出处。【本文受版权保护】转载请注明出处:www.tangshuang.net

一般来说primaryKey的值都是唯一本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】的,但也不排除有些情况不唯一的时候,这个【版权所有,侵权必究】【本文受版权保护】时候,使用游标结合continuePri本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。maryKey才能正确获得你想要的那个o【作者:唐霜】原创内容,盗版必究。bject,通过普通的get只能得到第一【本文首发于唐霜的博客】【作者:唐霜】个object。

【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】

delete()【作者:唐霜】

本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】

发起一个删除当前游标所在的object的【版权所有,侵权必究】转载请注明出处:www.tangshuang.netRequest。删除之后,就要考虑用co【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】ntinuePrimaryKey(),而转载请注明出处:www.tangshuang.net原创内容,盗版必究。不是continue()。

【未经授权禁止转载】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】

update()【作者:唐霜】

未经授权,禁止复制转载。未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。

发起一个更新当前游标所在的这个objec未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。t的对应字段的值的Request。它有一【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】个参数:

【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。

小结【关注微信公众号:wwwtangshuangnet】

著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】

本文所有的内容就讲完了,本文从 Inde未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。xedDB 的概念和结构开始,把所有常用转载请注明出处:www.tangshuang.net原创内容,盗版必究。的 API 都讲了一遍,并且还给出了很多【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。例子。
本文作者:唐霜,转载请注明出处。【未经授权禁止转载】 有人做过一个预测,Web SQL 数据【转载请注明来源】【本文首发于唐霜的博客】库已经从标准中移除了,有可能在后面的浏览本文版权归作者所有,未经授权不得转载。【本文受版权保护】器版本中被去除,IndexedDB 将有著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net可能统一浏览器本地化存储的数据库。

原创内容,盗版必究。未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】

虽然本文对大部分 IndexedDB 的【转载请注明来源】著作权归作者所有,禁止商业用途转载。接口都进行了讲解,但是还只是入门教程,还本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。有很多东西没讲。举个例子,作为数据库,最转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】重要的就是检索功能,也就是索引检索的那个【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。部分,但是本文并没有对这个部分展开。索引【本文首发于唐霜的博客】原创内容,盗版必究。检索还可以实现阈值检索,比如检索某一段日【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。期内的所有 object,比如检索所有同【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】姓氏的同学,这些问题都是经常遇到的,但都原创内容,盗版必究。原创内容,盗版必究。不再本文的讲解范围内。想要完全了解 in【未经授权禁止转载】【作者:唐霜】dexedDB,还需要你继续深入学习。

【版权所有,侵权必究】【本文首发于唐霜的博客】【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】

参考文献【作者:唐霜】

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】原创内容,盗版必究。
  1. HTML5 indexedDB前端本地存【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】储数据库实例教程
  2. 【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】【本文受版权保护】
  3. indb【原创内容,转载请注明出处】 可能是最便捷的 indexedDB 操【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】作库
  4. 原创内容,盗版必究。未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net
  5. Dexie.js【原创内容,转载请注明出处】 将 indexeddb 封装成类 sq【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。l 操作的库
  6. 原创内容,盗版必究。【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net

如果你觉得本书对你有帮助,通过下方的二维码向我打赏吧,帮助我写出更多有用的内容。

2017-09-09 |

已有11条评论
  1. Feng 2024-09-23 11:13

    文章中的部分图片失效了

    • 否子戈 2024-10-05 22:50

      CDN域名证书过期了,已经修复

  2. Liang 2023-04-01 08:14

    最近在做ChatGPT相关的一个项目,想在浏览器本地保存聊天记录,才知道了有内置 indexedDB 这个数据库,在尝试之后发现好难用!

    在网上搜索到了 Dexie.js 封装了相关的 API,找中文教程时顺藤摸瓜找到了博主的文章,非常感谢您,写得很详细,很多我不理解东西都被讲明白了,今晚尝试一下!

  3. 傅莺仟 2022-12-29 13:51

    我想请教一个问题,indexdb上存储的数据怎么可以转移到另外一个pc端(假设数据量比较大,除了通过将数据全部查询出来,然后再一条一条导入新的的pc端,还有什么好的办法吗?)

    • 否子戈 2023-01-03 11:16

      indexeddb属于本地持久化存储,它设计的目标就是本地存储,不是共享,如果你是要共享数据,应该是搭数据服务,如果只是为了做数据迁移,目前没有更好的办法,自己写个程序把库导出为一个json,再发送给另外一个用户写个导入程序

  4. Coolkk 2020-02-22 00:27

    感谢教程。

  5. 老李 2019-12-02 10:05

    感謝大大分享
    非常實用且完整
    解釋淺顯易懂
    讓在網路上自學的我收穫匪淺

  6. ospider 2018-02-28 01:40

    关于版本那一块,好像文中也没有详细解释了,如果有时间,还请写一下呀

    > 这时你会想,如果我从新的version切换为老的version,还可以在老的version里面添加数据吗?这个问题我们暂时保留。

    • 否子戈 2018-02-28 14:11

      在文章中添加来补充内容,关于降级我没有实际测试过,如果你有兴趣对话,可以试一下。

  7. ospider 2018-02-26 18:59

    代码都被压成一行了。。大佬有时间改下么

    • 否子戈 2018-02-28 13:09

      谢谢提醒