IndexedDB 中文教程
前言【版权所有】唐霜 www.tangshuang.net
【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】indexedDB 是 html5 标准【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】引入的web数据持久化方案之一,现代浏览【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net器大多按照标准对其进行了实现,我在新的项【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】目中用到它来作为持久化数据存储,于是详细原创内容,盗版必究。【原创不易,请尊重版权】研究了一番,MDN 上的解释虽然权威,但转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】是由于知识不成体系,细节也讲的不透,所以【转载请注明来源】【本文首发于唐霜的博客】我打算自己写一篇教程,对 indexed本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netDB 的各个细节进行详解。
【本文受版权保护】本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net
IndexedDB 在线视频教程,7个课【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net时让你精通 indexedDB 的操作和本文版权归作者所有,未经授权不得转载。【转载请注明来源】理解底层标准设计,助你在前端开发中游刃有本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。余地使用数据存储
【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】为了和读者更贴近,我做了上面这套【原创不易,请尊重版权】视频教程著作权归作者所有,禁止商业用途转载。,总共7个课时,每天一小时,7天可学完。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net虽然本文的内容已经覆盖了所有与 inde【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.netxedDB 相关的内容,但是视频教程的方【未经授权禁止转载】【原创不易,请尊重版权】式更轻松,而且其中有关概念的部分讲解的更本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net详细。掌握一门技术,不需要很长时间,7天【转载请注明来源】【原创内容,转载请注明出处】就可以。视频教程是付费教程,价格不贵,写【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。教程真的不容易,希望大家多支持。
本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。架构体系本文版权归作者所有,未经授权不得转载。
【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。这里说的结构体系,是指在 indexed【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】DB 中,几个重要的概念之间的关系。这些【本文受版权保护】本文作者:唐霜,转载请注明出处。概念包括:
【作者:唐霜】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。- 数据库原创内容,盗版必究。 【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。
- objectStore【作者:唐霜】 转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net
- key-value【转载请注明来源】 未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。
简单的说,indexedDB 是非关系型【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】数据库,数据组织不像 SQL 数据库一样未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net,有表和字段,indexedDB 里面没【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net有表和字段的概念,它的最小组织单位(un【本文受版权保护】【未经授权禁止转载】it)是 key-value。在 ind著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】exedDB 里,一对 key-valu原创内容,盗版必究。【版权所有,侵权必究】e 就相当于 SQL 数据库里面的一条记【原创内容,转载请注明出处】【本文受版权保护】录,是数据的最终体现形式。我们通过下面的【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】图来阐述 indexedDB 和 SQL【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。 数据库结构体系的不同,以帮助理解。
本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】
关系型数据库和非关系型数据库本身有非常大【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net的差别,关系型数据库大致上架构是一致的,【转载请注明来源】本文作者:唐霜,转载请注明出处。但是非关系型数据库的架构各式各样,很不统【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net一。就 SQL DB 和 indexed转载请注明出处:www.tangshuang.net【版权所有,侵权必究】DB 而言:
【关注微信公众号:wwwtangshuangnet】【作者:唐霜】【版权所有,侵权必究】- 在最下面那一层,两者都有 databas【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】e 的概念,要存储数据,首先要创建一个数【本文受版权保护】著作权归作者所有,禁止商业用途转载。据库。 著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【转载请注明来源】
- 往上一层,两者就有了区别,SQL DB 【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net有表的概念,而 indexedDB 对应【版权所有】唐霜 www.tangshuang.net【作者:唐霜】的是 objectStore。 【原创不易,请尊重版权】【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。
- 再往上一层,差别更大,SQL DB 的记本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。录有字段的概念,而 indexedDB 未经授权,禁止复制转载。【作者:唐霜】的记录直接是键值对。 【原创内容,转载请注明出处】【转载请注明来源】未经授权,禁止复制转载。【原创不易,请尊重版权】【未经授权禁止转载】
indexedDB 中的 objectS著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.nettore 虽然和 SQL DB 中的 t【原创不易,请尊重版权】转载请注明出处:www.tangshuang.netable 非常像,但是它们的存储形式却极【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。其不同。objectStore 比 ta【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。ble 简单的多。
转载请注明出处:www.tangshuang.net【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。同时,indexedDB 内置了事务系统未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。,所有读写操作都是在事务中完成。
本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】【未经授权禁止转载】【原创不易,请尊重版权】原创内容,盗版必究。数据库本文版权归作者所有,未经授权不得转载。
著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】indexedDB 是一个完备模型的数据本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】库,有标准的数据库结构体系。它虽然不是一【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。个运行时服务,而是基于文件的即时存取数据本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。库,但是仍然可以用其他数据库的模型思维来【本文首发于唐霜的博客】【转载请注明来源】了解它。在 indexedDB 中,我们【本文受版权保护】【关注微信公众号:wwwtangshuangnet】可以创建多个数据库,每个数据库有自己独立【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。的空间。
【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。连接数据库【本文首发于唐霜的博客】
【本文受版权保护】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。要在 indexedDB 中存储数据,要【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】进行两步操作,第一步连接到某个数据库,第著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】二步挑选某个 objectStore 进【原创不易,请尊重版权】【原创内容,转载请注明出处】行数据操作。现在讲解连接到 indexe未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】dDB 数据库。在 window 对象上转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net有一个 indexedDB 对象,直接调【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】用 open 方法进行打开,如果该数据库著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net不存在,则创建一个新的数据打开:
本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.netconst request = window.indexedDB.open('mydb', 1)
open有两个参数:原创内容,盗版必究。
【版权所有,侵权必究】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。- name:数据库名本文版权归作者所有,未经授权不得转载。 【作者:唐霜】原创内容,盗版必究。未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【作者:唐霜】
- version:版本【版权所有,侵权必究】 【本文受版权保护】【原创内容,转载请注明出处】原创内容,盗版必究。
数据库版本本文版权归作者所有,未经授权不得转载。
转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【本文受版权保护】转载请注明出处:www.tangshuang.net上面的version参数对于初学者而言不本文作者:唐霜,转载请注明出处。原创内容,盗版必究。是很好理解。如果你用过 docker 的【原创内容,转载请注明出处】【版权所有,侵权必究】话,知道有一个东西叫镜像(image),【本文受版权保护】【作者:唐霜】在镜像的基础上构建自己的容器,可以再创建【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。一个新的镜像,那么这个新的镜像其实就包含著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】了老的镜像。这里的 version 也类【本文受版权保护】【原创不易,请尊重版权】似,它表示当前的数据库结构的版本。ver著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】sion 必须是正整数,只能升不能将,只本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】有当需要进行数据库结构修改的时候,才需要著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。升级 version。
著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】例如,一开始,version 为 1,创【版权所有,侵权必究】【转载请注明来源】建了一些 objectStore,当你需著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net要添加新的 objectStore 或者原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】修改某些 objectStore 的时候著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net,就需要升级 version。一个数据库【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】只能在同一时间存在一个 version,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】不能同时存在多个 version。当你的著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net version 升级之后,你还用老的 【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.netversion 去连接数据库,并进行数据【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】操作时,会抛出错误。
【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。补充:有同学留言想对这个问题进行深入探讨本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】。我这里说一下我的想法。从项目的开发上讲转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net,我们只会在发布代码时去升级 versi未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.neton,而不会在程序运行过程中通过程序去更【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。改 version,因为一旦用户刷新页面本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】,这个 version 会变成代码中设置本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net的 version,这会造成错误。我们升【本文受版权保护】【本文受版权保护】级 version,是为了对数据库结构进【版权所有,侵权必究】【未经授权禁止转载】行修改,触发 onupgradeneeded 方法。本文版权归作者所有,未经授权不得转载。
【原创不易,请尊重版权】【本文受版权保护】【转载请注明来源】【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】在MDN里面有这样一句话:【转载请注明来源】When you call open()【作者:唐霜】未经授权,禁止复制转载。 with a greater vers【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netion than the actual 转载请注明出处:www.tangshuang.net原创内容,盗版必究。version of the datab著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。ase, all other open 本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】databases must expli【转载请注明来源】本文版权归作者所有,未经授权不得转载。citly acknowledge th【未经授权禁止转载】【原创内容,转载请注明出处】e request before you著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。 can start making ch【未经授权禁止转载】未经授权,禁止复制转载。anges to the databas未经授权,禁止复制转载。未经授权,禁止复制转载。e (an onblocked even【作者:唐霜】【原创内容,转载请注明出处】t is fired until the【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.nety are closed or relo本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。aded). 也就是说,1. 你要传入一个更大当版本【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。来触发 onupgradeneeded,【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。2. 在数据库处于 open 状态时,对【未经授权禁止转载】【未经授权禁止转载】数据库对修改是被 block 住,直到它转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】被 close 或 reload 之后,【未经授权禁止转载】【转载请注明来源】这些修改才会生效。
本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。
现在你需要记住的是,在后面的代码操作中,【原创不易,请尊重版权】【本文首发于唐霜的博客】你要时刻保证你使用对了 version,【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。它的使用场景只有两种:
未经授权,禁止复制转载。【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net- 当你需要修改 objectStore 时 本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net
- 当你需要添加新的 objectStore【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net 时 【作者:唐霜】【本文首发于唐霜的博客】【原创不易,请尊重版权】
从代码的层面来看,并非这两个事情发生才触转载请注明出处:www.tangshuang.net【本文受版权保护】发了 version 的改变,恰恰相反,【本文受版权保护】著作权归作者所有,禁止商业用途转载。如果你要修改或添加 objectStor【版权所有,侵权必究】【版权所有,侵权必究】e,你必须通过传递新的 version 【原创内容,转载请注明出处】【原创内容,转载请注明出处】参数到 open 方法中,触发 onupgradeneeded,在 on【本文受版权保护】【作者:唐霜】upgradeneeded 的回调函数中【原创不易,请尊重版权】【本文受版权保护】才能实现目的。
原创内容,盗版必究。未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】获得 db 容器原创内容,盗版必究。
转载请注明出处:www.tangshuang.net【未经授权禁止转载】【作者:唐霜】原创内容,盗版必究。【原创内容,转载请注明出处】怎么从上面的 open 方法之后,获得可未经授权,禁止复制转载。【本文首发于唐霜的博客】以用来进行操作的数据库对象容器:
【原创内容,转载请注明出处】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】const request = window.indexedDB.open('mydb', 1)
request.onsuccess = e => {
const db = e.target.result
}
这样就获得了db的容器,利用该容器,我们转载请注明出处:www.tangshuang.net【转载请注明来源】就可以进行数据库的下一步操作。
未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net这是一个异步的操作,你不能在上面代码之后【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。直接使用 db 变量,而是要在 onsu【本文首发于唐霜的博客】【原创内容,转载请注明出处】ccess 的函数体内继续写代码。而且 【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】indexedDB 的所有编程都是这样,著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】这会导致嵌套层层加深,因此,我们这篇文章著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。后面还会提供使用 Promise 进行封本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net装的类,使用该类你无需做复杂的操作。
本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】objectStore【未经授权禁止转载】
【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】objectStore 是 indexe【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netdDB 中非常核心的概念,它是数据的存储【作者:唐霜】【版权所有,侵权必究】仓库,一个 objectStore 类似本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】于 SQL 数据库中的表,存放着相关的所【版权所有,侵权必究】未经授权,禁止复制转载。有数据记录。
【作者:唐霜】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】本文作者:唐霜,转载请注明出处。什么是 objectStore?【原创内容,转载请注明出处】
原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。indexedDB 是 key-valu原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。e 数据库,具体体现就是 objectS本文作者:唐霜,转载请注明出处。【未经授权禁止转载】tore. objectStore 是 原创内容,盗版必究。原创内容,盗版必究。indexedDB 的数据存储机制,和 本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】SQL 的表的地位一致。每一条记录包含了未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net key 和 value。
著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。【未经授权禁止转载】【版权所有,侵权必究】
indexedDB 之所以将自己的存储机【本文受版权保护】转载请注明出处:www.tangshuang.net制称为 objectStore,在 st本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netore 前面加上 object,是因为它本文作者:唐霜,转载请注明出处。【未经授权禁止转载】所存储的记录的集合,就像一个 objec【本文受版权保护】【本文受版权保护】t 一样,是一个 key-value 的【原创内容,转载请注明出处】【未经授权禁止转载】集合。
本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。什么是 key?【本文受版权保护】
原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】key 是 value 的标记值。【本文首发于唐霜的博客】
【作者:唐霜】【本文首发于唐霜的博客】未经授权,禁止复制转载。未经授权,禁止复制转载。我们通过 key 得到 indexedD著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。B 中存储的对应值。要获得 value,【版权所有,侵权必究】【本文受版权保护】必须通过 key 来获得。key 和 v转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。alue 具有绑定关系,key 相当于 本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。value 的缩写、别名、标记。
【本文受版权保护】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net但和 localStorage 不同,i未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.netndexedDB 的 key 有两种形态著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】:inline 和 outline。in【原创内容,转载请注明出处】【转载请注明来源】line key 是指 key 被包含在未经授权,禁止复制转载。原创内容,盗版必究。 value 中,例如你存储的 valu著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】e 是对象时,就可以将 key 包含在 【转载请注明来源】【版权所有,侵权必究】value 中。outline key 【转载请注明来源】本文作者:唐霜,转载请注明出处。则是不被包含在 value 中,例如你存本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】储的是字符串,或者 ArrayBuffe本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netr,就不可能在 value 中包含 ke【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。y,这种情况下通过开启 autoIncr【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。ement 来实现,下文会详细介绍。
【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】
上图中上面一条记录的 value 是一个原创内容,盗版必究。本文作者:唐霜,转载请注明出处。对象,key 来自对象的 id 属性值,著作权归作者所有,禁止商业用途转载。【作者:唐霜】这个 key 是 inline key。【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。下面一条记录,value 是一个字符串,【原创内容,转载请注明出处】【作者:唐霜】key 是由系统自动生成,这个 key 未经授权,禁止复制转载。【本文受版权保护】是 outline key。
【未经授权禁止转载】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net例如有一个值是 转载请注明出处:www.tangshuang.net{ body: { color: 'red' } } 而 keyPath 为 本文作者:唐霜,转载请注明出处。body.color,那么就可以得到 key 为 著作权归作者所有,禁止商业用途转载。red。这可能和我们以前理解的地方有所不同。在本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】 IndexedDB 中,我们要通过 r【转载请注明来源】著作权归作者所有,禁止商业用途转载。ed 去找到这个值。
什么是 keyPath?【未经授权禁止转载】
【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】原创内容,盗版必究。keyPath 是指在对象中,获取一个节【原创不易,请尊重版权】未经授权,禁止复制转载。点值的属性链式方法的字符串表达。例如:
本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】未经授权,禁止复制转载。【版权所有,侵权必究】{
books: [
{ name: 'My Uncle Tom', price: 13.4 }
],
}
其中我要获得第一本书的价格,那么它的 k著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。eyPath 就是 ‘boo未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。ks[0].price’。它著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net是一个字符串,但可以用来表达获得一个节点本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】值的属性路径。所以,keyPath 这个【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。单词中的 path 就是这个意思。
本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。key 和 keyPath 的联系未经授权,禁止复制转载。
【版权所有,侵权必究】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【作者:唐霜】keyPath 的作用是读取 key。【本文受版权保护】
本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【本文受版权保护】【原创内容,转载请注明出处】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【作者:唐霜】【转载请注明来源】key 是 value 的 keyPat【转载请注明来源】【原创内容,转载请注明出处】h 的值。
原创内容,盗版必究。【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。
这句话的意思是:1. value 是一个转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。对象,2. 以 keyPath 作为属性【原创不易,请尊重版权】【本文受版权保护】路径从 value 中读取某个节点的值;著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。3. 这个值就是 key。当然,这里面有【未经授权禁止转载】【原创内容,转载请注明出处】一些前提条件,例如“value 是一个对【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。象”,不是字符串,“value 存在 k【原创不易,请尊重版权】未经授权,禁止复制转载。eyPath,并能读取值”。
转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】【未经授权禁止转载】一般而言,keyPath 在创建 obj本文作者:唐霜,转载请注明出处。原创内容,盗版必究。ectStore 和 index 的时候【本文受版权保护】本文版权归作者所有,未经授权不得转载。就已经确定了,不会改。所以,在实际编程的【本文受版权保护】本文作者:唐霜,转载请注明出处。时候,我们很少会去用 keyPath,而【作者:唐霜】未经授权,禁止复制转载。是拿到一个 key 进行操作。
【转载请注明来源】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【转载请注明来源】【原创不易,请尊重版权】keyPath 的高级用法是,支持一个数【本文受版权保护】本文版权归作者所有,未经授权不得转载。组作为 keyPath,但这个我们不深入【本文受版权保护】【原创内容,转载请注明出处】探讨。如果 keyPath 是一个数组,【版权所有,侵权必究】【原创不易,请尊重版权】表示在查询的时候,只要其中之一可以查到值著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。,就返回得到的值。
【版权所有,侵权必究】【作者:唐霜】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【原创内容,转载请注明出处】对于 outline key 的情况,在著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。创建 objectStore 时,我们不【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。能传 keyPath,并且开启 auto【作者:唐霜】【版权所有,侵权必究】Increment,indexedDB 著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】会默认以 ‘id’未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。; 作为 keyPath,但我们不会用到【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。这个 ‘id’。
转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【版权所有,侵权必究】【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。可以存储哪些数据类型?本文版权归作者所有,未经授权不得转载。
【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。根据 w3c 文档【原创不易,请尊重版权】描述【本文受版权保护】,indexedDB 可以存储的数据类型【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】为:
转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【本文受版权保护】【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。String, Date, Object转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】, Arra, File, 【未经授权禁止转载】Blob, 原创内容,盗版必究。ImageData等等。另外,网上很多人指出,支持存储 A【作者:唐霜】【本文受版权保护】rrayBuffer。
根据 w3c 的描述,凡是能进行序列化的本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】值,都可以被 indexedDB 存储。转载请注明出处:www.tangshuang.net原创内容,盗版必究。也就是说,不能被序列化的,例如自引用的 【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】object,或者某些类的实例,还有 f转载请注明出处:www.tangshuang.net【转载请注明来源】unction,就不能被 indexed【本文首发于唐霜的博客】未经授权,禁止复制转载。DB 存储。简单理解就是,不能存func原创内容,盗版必究。【版权所有,侵权必究】tion等非结构化的数据,object必【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】须是以键值对组成的字面对象。
转载请注明出处:www.tangshuang.net原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。创建 objectStore【转载请注明来源】
转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】创建 objectStore 和修改 o原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。bjectStore 都只能在 db 的原创内容,盗版必究。转载请注明出处:www.tangshuang.net onupgradeneeded 事件中进【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】行,因此,要创建 objectStore【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net,必须在前面的 open 操作那个时候来原创内容,盗版必究。【原创内容,转载请注明出处】进行。
【未经授权禁止转载】【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。未经授权,禁止复制转载。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【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】jectStore 的创建。但是,需要注【作者:唐霜】本文作者:唐霜,转载请注明出处。意的是,一个 database 中,只允本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。许存在一个同名的 objectStore【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。,因此,如果你第二次 createObj【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。ectStore 相同名的objectS原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。tore,程序会报错。比如你的程序如果像【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】上面这样写,必然会遇到一个问题,就是当你转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。更新 version 的时候,会再次执行【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】 createObjectStore,那原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。么就会报错,程序就会中断。另一个注意点是【本文受版权保护】【转载请注明来源】,一旦一个 objectStore 被创本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】建,它的 name 和 keyPath 【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net是不能修改的。那么有什么办法来控制呢?通本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net过一个判断,判断是否已经存在同名的 ob【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。jectStore 即可。
【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】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【作者:唐霜】【原创内容,转载请注明出处】 被升级了的时候执行。因此,所有的数据库【转载请注明来源】【原创不易,请尊重版权】结构的东西,都要放在这个函数内去做。
【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netobjectStore 创建之后不可修改【本文受版权保护】【本文受版权保护】,如果创建时失误,给了错误的配置,必须先【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net删除该 objectStore 之后,重【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net新创建。
未经授权,禁止复制转载。【作者:唐霜】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。objectStore 的类型本文作者:唐霜,转载请注明出处。
未经授权,禁止复制转载。【原创内容,转载请注明出处】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】在编程上,不需要去分 objectSto原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netre 的类型。但是,在我们实际存储数据的【转载请注明来源】著作权归作者所有,禁止商业用途转载。时候,我们自己需要去区分,因为不同类型的未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net objectStore 用法不同。
【未经授权禁止转载】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【本文受版权保护】对象型仓库【版权所有】唐霜 www.tangshuang.net
原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。如果一个 objectStore 是用来【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net存对象的,那么这种情况下你应该每次都存入【转载请注明来源】【转载请注明来源】一个对象,而且,这个对象有一个属性路径是【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】规定的 keyPath。倘若这个对象不存本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。在对应的 keyPath,那么就会报错。
【转载请注明来源】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】这里的对象不包括数组。【转载请注明来源】
【作者:唐霜】【本文首发于唐霜的博客】未经授权,禁止复制转载。db.createObjectStore('mystore', { keyPath: 'id' })
非对象型仓库【版权所有】唐霜 www.tangshuang.net
【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】未经授权,禁止复制转载。【本文首发于唐霜的博客】如果一个 objectStore 是用来【转载请注明来源】【版权所有】唐霜 www.tangshuang.net存非对象的,例如我们经常会考虑用来存 A【转载请注明来源】【版权所有,侵权必究】rrayBuffer,这个时候,你应该在转载请注明出处:www.tangshuang.net原创内容,盗版必究。创建 objectStore 的时候,传未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net入配置信息 autoIncrement 转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】为 true,不传 keyPath。
著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【作者:唐霜】db.createObjectStore('mystore', { autoIncrement: true })
这种情况下,存入数据(ArrayBuff著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】er)时,key 会被自动添加上,且跟 原创内容,盗版必究。原创内容,盗版必究。SQL 数据的自增字段一样,索引值会在原【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。有基础上自加 1。在查询或更新值的时候,原创内容,盗版必究。【转载请注明来源】都要使用这个值作为 key。但是,这种情本文作者:唐霜,转载请注明出处。原创内容,盗版必究。况下,会有一个问题,key 是在运行时保著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】存在内存中的,一旦用户刷新页面,你就不知【本文受版权保护】转载请注明出处:www.tangshuang.net道刚刚插入的值的 key 了。对于这种情著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net况,如果想持久化,可以和 localSt本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】orage 一起使用来解决。
著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【本文受版权保护】混合仓库未经授权,禁止复制转载。
本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】【原创内容,转载请注明出处】【作者:唐霜】【关注微信公众号:wwwtangshuangnet】如果你硬是要在一个 objectStor【原创内容,转载请注明出处】未经授权,禁止复制转载。e 中混合存值,那么必须按照非对象型仓库【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net来使用。但是会有一个不一样的地方,当你存【原创内容,转载请注明出处】【本文首发于唐霜的博客】入一个对象时,如果该对象中并没有对应的 【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.netkeyPath,那么,它会在存入时被自动【版权所有,侵权必究】【作者:唐霜】加上这个 keyPath。这一点非常奇怪未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。,你会发现,存入 string, Blo【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】b 和存入 object 的效果竟然不同著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。。
本文版权归作者所有,未经授权不得转载。【作者:唐霜】转载请注明出处:www.tangshuang.net【作者:唐霜】db.createObjectStore('mystore', { keyPath: 'id', autoIncrement: true })
当你插入的对象中不存在 id 属性时,对未经授权,禁止复制转载。【未经授权禁止转载】象会被污染,会自动加上 id 属性,并且原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。赋予一个数字作为 key。
著作权归作者所有,禁止商业用途转载。【作者:唐霜】【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【本文首发于唐霜的博客】什么是 autoIncrement?【原创内容,转载请注明出处】
【原创不易,请尊重版权】【原创内容,转载请注明出处】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net前面提到过 autoIncrement,【原创内容,转载请注明出处】【未经授权禁止转载】但是没有详细解释。这需要涉及到一个叫 key generator【作者:唐霜】 的东西,但是它过于底层,我们这里不深入【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net讲解,你可以自行了解,我们这里做简化说明【作者:唐霜】【原创不易,请尊重版权】。autoIncrement 是一个配置【本文受版权保护】【原创不易,请尊重版权】。当创建 objectStore 时,如未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。果 autoIncrement 被设置为未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。 true,那么它的 key 将具备自动【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。生成的能力。
原创内容,盗版必究。【转载请注明来源】本文版权归作者所有,未经授权不得转载。什么是自动生成?本文作者:唐霜,转载请注明出处。
【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net【作者:唐霜】- 当存入的值不存在对应的 keyPath 【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。时,自动创建 keyPath,并用一个自未经授权,禁止复制转载。【原创内容,转载请注明出处】动生成的数字作为 key,这个动作被成为本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】“污染” 【原创不易,请尊重版权】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】原创内容,盗版必究。
- 自动生成的数字从 1 开始自增长,每次加【本文受版权保护】原创内容,盗版必究。 1 转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【转载请注明来源】【作者:唐霜】
- 当用户手动传入 key 时,如果是一个数【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。字,自增长的值会被覆盖,下次插入时,会从【转载请注明来源】【本文受版权保护】新的值开始计算 【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【原创内容,转载请注明出处】原创内容,盗版必究。
- 如果手动传入的 key 不是数字,那么不【原创不易,请尊重版权】【本文受版权保护】影响 key 的自增长,下次插入仍然以之未经授权,禁止复制转载。【原创内容,转载请注明出处】前的值作为基底 【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net
- 它的最大取值范围为 2【版权所有,侵权必究】53【版权所有】唐霜 www.tangshuang.net,超出时,继续享受自增长会报错,但可以通【作者:唐霜】【版权所有】唐霜 www.tangshuang.net过自己给明确的字符串 key 继续添加记原创内容,盗版必究。【作者:唐霜】录 著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【版权所有,侵权必究】【转载请注明来源】【版权所有,侵权必究】
- 在一条记录被插入时,add 或 put 转载请注明出处:www.tangshuang.net原创内容,盗版必究。方法会返回该记录的 key 【版权所有,侵权必究】【本文首发于唐霜的博客】【作者:唐霜】著作权归作者所有,禁止商业用途转载。
- 对于非对象的存入值,不会产生污染效果【未经授权禁止转载】 【作者:唐霜】著作权归作者所有,禁止商业用途转载。【转载请注明来源】
对于对象型仓库,如果新增的值不存在对应的【本文受版权保护】【本文受版权保护】 key,那么被存的值会被“污染”。标准【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。文档中是这么说的:“Then the v未经授权,禁止复制转载。【未经授权禁止转载】alue provided by the【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】 key generator is us【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】ed to populate the k转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】ey value.”也就是说,你在取出这【本文受版权保护】本文版权归作者所有,未经授权不得转载。个值的时候,这个 key 被添加到了值上原创内容,盗版必究。【原创不易,请尊重版权】,也就是说,存入的值被改了(添加了属性)原创内容,盗版必究。【原创不易,请尊重版权】。
【本文首发于唐霜的博客】【原创不易,请尊重版权】【转载请注明来源】【版权所有】唐霜 www.tangshuang.net对于我们开发者而言,一般的建议是,如果你【作者:唐霜】未经授权,禁止复制转载。的 objectStore 用于存储对象未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】,尽量不要开启 autoIncremen【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。t 功能。只有在储存非对象值时,一定要开未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。启 autoIncrement 功能。不本文版权归作者所有,未经授权不得转载。【转载请注明来源】建议使用混合型仓库。
【转载请注明来源】【版权所有,侵权必究】【本文首发于唐霜的博客】index著作权归作者所有,禁止商业用途转载。
【作者:唐霜】【作者:唐霜】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】索引是 indexedDB 中最值得玩味转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】的部分,这也是它取名“indexedDB【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】”的原因。索引,是一系列概念的统称:
本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【本文受版权保护】本文版权归作者所有,未经授权不得转载。- 用于存储索引的空间被称为“索引”,例如我转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】们可以称 objectStore 的一个【未经授权禁止转载】未经授权,禁止复制转载。索引 著作权归作者所有,禁止商业用途转载。【转载请注明来源】【本文首发于唐霜的博客】【本文受版权保护】
- 某条记录的索引也被称为“索引”,例如我们著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net可以称 value 的 indexNam本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。e 索引 【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net
简单的说,索引是独立于 objectSt著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。ore 之外,但又和 objectSto【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】re 绑定的,用于建立更多查询线索的工具本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。。
原创内容,盗版必究。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【转载请注明来源】什么是 index?【版权所有】唐霜 www.tangshuang.net
本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。本质上,一个 index 是一个特殊的 原创内容,盗版必究。【本文首发于唐霜的博客】objectStore,它的存储结构和 著作权归作者所有,禁止商业用途转载。【转载请注明来源】objectStore 基本一致,也有自【本文受版权保护】【本文受版权保护】己的 name(本文标记为 indexN【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】ame), keyPath, key 和【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】 value。特殊之处在于,索引的 ke原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】y 具有一定的逻辑约束,例如 uniqu本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。e 用于规定该 key 是唯一的。
【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【作者:唐霜】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。
上图是一个 index 存储器的示意图,著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。一个 objectStore 可以有多个转载请注明出处:www.tangshuang.net【转载请注明来源】 index 和自己绑定。
未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】index 和 objectStore 未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】的关系
著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【作者:唐霜】index 依附于 objectStor【未经授权禁止转载】未经授权,禁止复制转载。e。我们在创建索引时,首先要得到一个 o【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。bjectStore,再在这个 obje【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。ctStore 的基础上创建一个索引。一【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。个 objectStore 可以有多个索未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。引。
【转载请注明来源】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】转载请注明出处:www.tangshuang.netindex 的 key 和 value 【版权所有,侵权必究】【版权所有,侵权必究】全部来自 objectStore。key原创内容,盗版必究。【作者:唐霜】 为某条记录的 keyPath(inde未经授权,禁止复制转载。未经授权,禁止复制转载。x.keyPath)的值,value 为【本文首发于唐霜的博客】【转载请注明来源】这条记录的 key(objectStor【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】e.key)。index 中的一条记录自【转载请注明来源】本文作者:唐霜,转载请注明出处。动和 objectStore 中的对应记转载请注明出处:www.tangshuang.net【未经授权禁止转载】录绑定,当 objectStore 中的本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】记录发生变化时,index 中的记录会自著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】动被污染(自动更新)。
【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。
index 实际上是对 objectSt【转载请注明来源】本文作者:唐霜,转载请注明出处。ore 查询条件的补充。如果没有 ind【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.netex,我们只能通过 objectStor本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】e 的 key 来查值,但是有了 ind【作者:唐霜】【版权所有】唐霜 www.tangshuang.netex,我们可以查询的能力被扩展到了任意属【本文首发于唐霜的博客】【原创内容,转载请注明出处】性路径。
转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】和 objectStore 不同,ind本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.netex 的同一个 key 可以存在多个,因著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。为不同的存入值的某个 keyPath 可【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net能存在相同的值。
【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net【作者:唐霜】如何创建索引?【原创不易,请尊重版权】
【未经授权禁止转载】【版权所有,侵权必究】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。创建索引这个动作,实际上是对 objec【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】tStore 进行修改,因此,只能在 d【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 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未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。eateIndex 方法,它可以创建索引原创内容,盗版必究。【未经授权禁止转载】。它有三个参数,第一个参数是这个索引的 【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】indexName,第二个参数是 key【作者:唐霜】未经授权,禁止复制转载。Path,第三个参数是 options,【原创内容,转载请注明出处】未经授权,禁止复制转载。其中 unique 选项被放在这里面。
转载请注明出处:www.tangshuang.net【作者:唐霜】【转载请注明来源】未经授权,禁止复制转载。如何修改索引?【未经授权禁止转载】
本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【原创不易,请尊重版权】虽然 objectStore 本身的信息本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。是不能修改的,比如 name 和 key【未经授权禁止转载】原创内容,盗版必究。Path 都是不能修改的,但是它所拥有的本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。索引可以被修改,修改其实就是删除+添加操著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net作。用到的就是 deleteIndex 【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。这个方法,所以,如果你想修改一个索引,要【未经授权禁止转载】【原创内容,转载请注明出处】做的就是先删除掉原来的同名索引,然后添加【未经授权禁止转载】转载请注明出处:www.tangshuang.net新的索引。举个例子,如果你知道数据库中已【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。经存在 mystore 这个 objec原创内容,盗版必究。转载请注明出处:www.tangshuang.nettStore 了:
【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【访问 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本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.nettore 的 index 进行操作,如果转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。存在某个 index 时,就删除它再添加【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】,如果没有就直接添加。
本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】索引的运行机制【作者:唐霜】
【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。indexName 是对一个索引的命名,【本文受版权保护】转载请注明出处:www.tangshuang.net这个名字会被用在按索引检索中,它本身和使著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net用被存储数据的那个属性路径没关系,但你可原创内容,盗版必究。【原创内容,转载请注明出处】以把它当做是一个别名。
【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】例如,你在创建索引的时候,是这样创建的:
【原创不易,请尊重版权】【本文首发于唐霜的博客】原创内容,盗版必究。objectStore.createIndex('indexName', 'index.keyPath', { unique: false })
在根据索引进行查询的时候,语法是这样的:
【作者:唐霜】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。const request = objectStore.index('indexName').get('indexKey')
这实际上是两个过程,第一个过程是在保存数【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】据时(包括创建和更新),索引区会同步更新未经授权,禁止复制转载。【本文受版权保护】自己的 key,它包含如下步骤:
【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。- 遍历该 objectStore 的所有索【本文首发于唐霜的博客】原创内容,盗版必究。引 著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。
- 读取索引的 keyPath,我们这里标记未经授权,禁止复制转载。【未经授权禁止转载】为 indexKeyPath 著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】
- 如果是更新某个值,遍历索引区记录,找到引本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。用该值的索引记录[1]【关注微信公众号:wwwtangshuangnet】 未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】
- 解析得到被存入的值的 indexKeyP【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】ath,得到目标值,这个值即索引将要使用【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】的 key,我们标记为 indexKey 【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】
- 索引 indexKey 的条件判断,例如未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。,检查是否满足 unique 要求,不满原创内容,盗版必究。【作者:唐霜】足的情况下,抛出错误提示 本文作者:唐霜,转载请注明出处。【本文受版权保护】未经授权,禁止复制转载。【未经授权禁止转载】
- 更新索引记录的 key 为 indexK【本文受版权保护】【本文首发于唐霜的博客】ey 【作者:唐霜】【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。
第二个过程是查询过程,【作者:唐霜】.index('indexName') 这个动作就是从名字为 indexNam【本文受版权保护】【原创内容,转载请注明出处】e 的索引区去进行索引查询,.get('indexKey') 这个动作包含了好几步:【未经授权禁止转载】
- 连接到名字为 ‘indexN【原创内容,转载请注明出处】【作者:唐霜】ame’ 的索引区 【本文首发于唐霜的博客】【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【本文受版权保护】【原创不易,请尊重版权】
- 在索引区中查询索引 key 为 R本文作者:唐霜,转载请注明出处。【未经授权禁止转载】16;indexKey’ 的著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。索引记录 【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】
- 得到该记录后,读取记录的 value【访问 www.tangshuang.net 获取更多精彩内容】 【本文首发于唐霜的博客】【转载请注明来源】本文版权归作者所有,未经授权不得转载。
- 将该 value 作为 objectSt【转载请注明来源】原创内容,盗版必究。ore 的 key 到 objectSt【未经授权禁止转载】【作者:唐霜】ore 中进行查询 【版权所有,侵权必究】【本文受版权保护】【未经授权禁止转载】
- 找到第一个结果时,直接返回原创内容,盗版必究。 【转载请注明来源】【转载请注明来源】【作者:唐霜】
- 将放回的结果作为索引查询的最终结果【原创不易,请尊重版权】 著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【原创内容,转载请注明出处】
从某种意义上讲,索引查询的性能肯定不如直【转载请注明来源】【关注微信公众号:wwwtangshuangnet】接通过 objectStore 的 ke【本文受版权保护】【本文受版权保护】y 查询。
【作者:唐霜】【原创内容,转载请注明出处】【原创内容,转载请注明出处】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net[1]【原创不易,请尊重版权】 在索引中,存在一个叫 【本文首发于唐霜的博客】referenced value未经授权,禁止复制转载。 的东西,即一个索引建立的时候,会自动引本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net用 objectStore 中对应的记录【关注微信公众号:wwwtangshuangnet】【转载请注明来源】。所以,对于开发者,不用担心索引是如何去【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】快速找到它在 objectStore 的【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net对应记录的。
著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【转载请注明来源】【转载请注明来源】什么是 unique?【原创不易,请尊重版权】
本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】默认情况下,index 的 key 是可本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】以重复的。所有的值被存在 objectS【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】tore 中,但是所有值除了 objec转载请注明出处:www.tangshuang.net【作者:唐霜】tStore 中规定的 keyPath 未经授权,禁止复制转载。【本文受版权保护】必须唯一之外,默认情况下,其他属性可以相【原创不易,请尊重版权】【转载请注明来源】同。但是,如果你建立的索引传入了 uni著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。que 参数,那么情况就会发生变化。也就【原创不易,请尊重版权】未经授权,禁止复制转载。是说,该索引的 keyPath 被用于检【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net查存入的值对应的 keyPath 是否已原创内容,盗版必究。转载请注明出处:www.tangshuang.net经有值,如果 objectStore 中转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】存在该 keyPath 的值为将要存入的【关注微信公众号:wwwtangshuangnet】【转载请注明来源】值的该 keyPath 值,那么会抛出错原创内容,盗版必究。转载请注明出处:www.tangshuang.net误。
【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】transaction【关注微信公众号:wwwtangshuangnet】
【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【原创内容,转载请注明出处】所有结构完备的数据库中都有“事务”这个概原创内容,盗版必究。【本文受版权保护】念,它是为了确保当并非执行某些操作时,不著作权归作者所有,禁止商业用途转载。【作者:唐霜】致混乱。举个简单的例子,当你在像好友打钱【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】的时候,发起了一个请求,这个请求发起后,【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】就建立了你打钱的事务,后面一大堆数据库写著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。入的操作,但是,假如中间突然机房停电,银【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。行系统发生故障,你又发起了第二个打钱的请【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】求,那么会不会有这样一种可能,你第一次打【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net出去的钱你朋友根本没收到?数据库系统为了未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。避免这种情况,采用事务机制,如果出错,那著作权归作者所有,禁止商业用途转载。【本文受版权保护】就回滚,把你打出去但对方没收到的钱回到你【原创不易,请尊重版权】【本文首发于唐霜的博客】账上,重新再执行一次打钱的操作,执行完这本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。个操作之后,再执行你第二次打钱的操作。这转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】样就保证了数据库增删改有序不混乱。
【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【本文受版权保护】未经授权,禁止复制转载。什么是 transaction?【未经授权禁止转载】
本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【转载请注明来源】indexedDB 里面的事务,保证了所【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。有操作(特别是写入操作)是按照一定的顺序【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。进行,不会导致同时写入的问题。另外,in本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】dexedDB 里面,强制规定了,任何读【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net写操作,都必须在一个事务中进行。从前面的【原创内容,转载请注明出处】【转载请注明来源】代码里面你也看到了,对 objectSt【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。ore 的修改,其实也是在一个事务中进行本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。。
【版权所有,侵权必究】【转载请注明来源】本文版权归作者所有,未经授权不得转载。特别是写操作,事务通过尝试性写入完成第一未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net步更新,如果整个尝试过程没有出错,那么会著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。通过一个 commit 操作使得整个更新著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。生效。但是如果在尝试过程中出错了,就会进【版权所有,侵权必究】【版权所有,侵权必究】行一个 abort 操作,之前做过的尝试未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net会直接被丢弃,数据不会发生改变。一个 o【版权所有,侵权必究】【本文受版权保护】bjectStore 的写入过程中,另外著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。一个写入操作会被挂起,直到上一个事务完成【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】。
本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】本文版权归作者所有,未经授权不得转载。【转载请注明来源】如何使用 transaction?【访问 www.tangshuang.net 获取更多精彩内容】
著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【原创内容,转载请注明出处】【本文受版权保护】在代码层面,我们必须通过 transac未经授权,禁止复制转载。【版权所有,侵权必究】tion 方法,向数据库容器提出事务要求转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。,才能往具体的 objectStore 【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net进行数据处理:
本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。let transaction = db.transaction(['myObjectStore'], 'readonly')
let objectStore = transaction.objectStore('myObjectStore')
let request = objectStore.get('111')
上面这段代码的操作,我们得到了具体要进行转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。操作的 objectStore,这和我们【原创不易,请尊重版权】【作者:唐霜】预期直接通过 db.objectStore('myObjectStore') 这样简洁的方法完全不同,indexed【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】DB 中不能这么直接去获取 object【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。Store,而必须通过 transact本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】ion。
transaction 方法有两个参数:
【作者:唐霜】【本文受版权保护】【作者:唐霜】【作者:唐霜】【转载请注明来源】- objectStores:事务打算对哪些【本文首发于唐霜的博客】【作者:唐霜】 objectStore 进行操作,因此【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net是一个数组 【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。
- mode:对进行操作的 objectSt转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netore 的模式,即读写权限控制, rea【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。donly | readwrite 未经授权,禁止复制转载。【原创内容,转载请注明出处】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。
而通过 transaction 的 ob未经授权,禁止复制转载。未经授权,禁止复制转载。jectStore 方法可以获取想要操作本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】的 objectStore,但是它的参数【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net必须存在于上面的 objectStore【本文受版权保护】著作权归作者所有,禁止商业用途转载。s 数组中,毕竟你的这个事务已经规定了要原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net对哪些 objectStore 进行操作未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】。
未经授权,禁止复制转载。原创内容,盗版必究。【原创不易,请尊重版权】因为 objectStore 是在事务中原创内容,盗版必究。【原创不易,请尊重版权】获取,因此一个 objectStore 【未经授权禁止转载】未经授权,禁止复制转载。实例,如果有一个 transaction【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】 属性的话,那么可以通过这个属性找出它的【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net事务的实例。在 indexedDB 中,【原创内容,转载请注明出处】【转载请注明来源】你只能在事务中得到一个 objectSt【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】ore 实例,如果通过 db 的话,最多【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。只能得到 objectStore 的名字未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。列表,要获得 objectStore 的【转载请注明来源】本文版权归作者所有,未经授权不得转载。实例,必须在 transaction 中【本文受版权保护】原创内容,盗版必究。。
原创内容,盗版必究。【原创不易,请尊重版权】【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net补充:由于js是单线程运行程序,所以对于本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】所有事务而言,也是有先后顺序的,只有当某未经授权,禁止复制转载。【原创不易,请尊重版权】些事务完成之后,才会进入后面当事务,因此【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。即使一个 objectStore 存在于【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。多个事务中,它也会按照事务出现当先后顺序转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。被操作,而不是被不同当事务交叉操作。另外未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。,对一个 objectStore 的写入【版权所有】唐霜 www.tangshuang.net【作者:唐霜】操作的事务只允许存在一个,它会自动根据你【未经授权禁止转载】本文作者:唐霜,转载请注明出处。传入的 mode 值为 readwrit转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.nete 时进行判断和报错。
【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。未经授权,禁止复制转载。
事务生命周期【版权所有】唐霜 www.tangshuang.net
本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】知道有事务的存在之后,【版权所有】唐霜 www.tangshuang.net一定要注意 indexedDB 事务的生【原创内容,转载请注明出处】【原创内容,转载请注明出处】命周期。一个事务,它会把你在它的生命周期里面规【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】定的操作全部执行,一旦执行完,周期结束,【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。那么事务就关闭了,你不能再利用这个事务的【原创不易,请尊重版权】【原创内容,转载请注明出处】实例进行下一步操作。
原创内容,盗版必究。【作者:唐霜】本文版权归作者所有,未经授权不得转载。转载请注明出处: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【原创内容,转载请注明出处】用一个变量保存起来,好在后续操作中使用。【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】但是,indexedDB 中,事务会在非【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。常短的时间里面循环检查自己,当发现自己内本文版权归作者所有,未经授权不得转载。【本文受版权保护】部已经没有任何任务要做的时候,就将自己关【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。闭。要深入了解这一点,你需要了解 jav转载请注明出处:www.tangshuang.net原创内容,盗版必究。ascript 调用栈、事件循环的知识,【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】可能有点复杂。
【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【未经授权禁止转载】总之,你可以把 indexedDB 里面本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。的事件想象成时间非常短(1ms)的 de转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】bounce,如果在这个 1ms 里面,【访问 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 事件的时候去【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net发起一个事务,再在这个事务中搞事情。
本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。什么是 request?著作权归作者所有,禁止商业用途转载。
【版权所有】唐霜 www.tangshuang.net【转载请注明来源】【本文受版权保护】我们操作数据,一定是在事务中进行。一个事【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】务,本质上是控制一个生命周期,用于保证数【版权所有,侵权必究】转载请注明出处:www.tangshuang.net据库读写的可用和安全。但是,真正涉及到如【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net何去存取数据,我们需要发起一个 requ未经授权,禁止复制转载。【原创内容,转载请注明出处】est。一个事务过程中,可以有多个 re转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】quest,request 一定存在与事【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。务中,因此它肯定会有一个 transac著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】tion 属性来获取它所属于的那个事务的本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。容器。
【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。为什么要有 request 呢?你可以把未经授权,禁止复制转载。未经授权,禁止复制转载。 transaction 当做一个队列,【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。在这个队列中,request 在进行排队著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。,每一个 request 都只包含一个操未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。作,比如添加,修改,删除之类的。这些操作未经授权,禁止复制转载。【原创不易,请尊重版权】不能马上进行,比如修改操作,如果你马上进【本文受版权保护】【关注微信公众号:wwwtangshuangnet】行,就会导致大家同时修改怎么办的问题,把【版权所有,侵权必究】原创内容,盗版必究。多个修改操作放在 request 中,这未经授权,禁止复制转载。原创内容,盗版必究。些 request 在 transact【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。ion 中排队,一个一个处理,这样就会有本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】执行的顺序,修改就有前后之分。同时,tr原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netansaction 都可以被 abort【未经授权禁止转载】【本文受版权保护】,这样当一系列的操作被放弃之后,后续的操【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。作也不会进行。
未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】而且非常重要的思想是,request 是【本文首发于唐霜的博客】【原创不易,请尊重版权】异步的,它有状态,一个 request 【作者:唐霜】【未经授权禁止转载】处于什么状态,可以通过 readyStates 属性查到,这对开发者而言也更可控。【本文受版权保护】
目前,在 indexedDB 中,有四种【作者:唐霜】本文版权归作者所有,未经授权不得转载。可能产生 request:open da【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.nettabase,objectStore r著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。equest, cursor reque【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】st, index request。
【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【未经授权禁止转载】cursor【原创内容,转载请注明出处】
【本文首发于唐霜的博客】原创内容,盗版必究。【原创不易,请尊重版权】【本文受版权保护】【原创不易,请尊重版权】虽然 indexedDB 使用 obje【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。ctStore 存储数据,是一个 key未经授权,禁止复制转载。【版权所有,侵权必究】-value 数据库。但是,我们有遍历所原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。有记录的需求。cursor 游标,就是 【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。indexedDB 提供的遍历整个 ob【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。jectStore 的能力接口。
【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】什么是 cursor?未经授权,禁止复制转载。
著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【本文首发于唐霜的博客】【原创不易,请尊重版权】概念上讲,游标是“一个用来记录数组正在被本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】操作的某个下标位置的迭代器”。举个例子,【转载请注明来源】未经授权,禁止复制转载。你有一个数组 [1,2,3,4],现在你未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】要对它进行遍历,使用 forEach 方【版权所有,侵权必究】【本文受版权保护】法,那么 forEach 方法怎么知道你【本文受版权保护】【版权所有】唐霜 www.tangshuang.net上次操作到第几个元素,现在应该操作第几个本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net元素呢?它通过内部的一个迭代器实现。游标【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。本质上是一个迭代器,也就意味着有类似于 本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。next 的方法,可以用来移动游标到下一【作者:唐霜】【版权所有,侵权必究】个位置,有 value 属性用来读取当前【本文受版权保护】原创内容,盗版必究。值。当然,游标不能理解为纯粹的迭代器,因【未经授权禁止转载】本文作者:唐霜,转载请注明出处。为它的内部过程需要进行 I/O 操作。
转载请注明出处:www.tangshuang.net【转载请注明来源】【未经授权禁止转载】【原创不易,请尊重版权】获取全部 object【转载请注明来源】
本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】想要获取一个 objectStore 中【作者:唐霜】转载请注明出处:www.tangshuang.net的全部 object 可不是一件简单的事【本文首发于唐霜的博客】未经授权,禁止复制转载。。indexedDB 1.0 版本的时候【本文受版权保护】原创内容,盗版必究。没有直接提供类似的方法来获取(2.0 已原创内容,盗版必究。本文作者:唐霜,转载请注明出处。经提供了 getAll 方法)。那么我们本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。应该怎么办呢?利用游标。
【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】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未经授权,禁止复制转载。未经授权,禁止复制转载。e() 来让游标滑动到下一个记录,ons【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】ucess 会被再次触发。而如果所有记录【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。都遍历完了,cursor 变量会是 un未经授权,禁止复制转载。原创内容,盗版必究。defined。
未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net注意上面蓝色的 results,它的声明【本文受版权保护】【本文首发于唐霜的博客】必须放在 onsuccess 回调函数的本文版权归作者所有,未经授权不得转载。【本文受版权保护】外部,因为该回调函数会在遍历过程中反复执【未经授权禁止转载】本文作者:唐霜,转载请注明出处。行。
【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。通过 index 查询集合【作者:唐霜】
未经授权,禁止复制转载。原创内容,盗版必究。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】前文举例过如何通过 index 查询值。【本文首发于唐霜的博客】【本文受版权保护】但是,在前面的演示代码中,仍然只能得到一【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。个值,加入我们希望通过 index 得到【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。某个 index key 的所有值呢?通转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。过游标就可以实现。
【访问 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。
【转载请注明来源】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。你也可以总结出游标的使用,简单的说,就是著作权归作者所有,禁止商业用途转载。【转载请注明来源】对已知的集合对象(比如 objectSt原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。ore 或 index)进行遍历,在 o【原创不易,请尊重版权】未经授权,禁止复制转载。nsuccess 中使用 continu原创内容,盗版必究。【原创不易,请尊重版权】e 来进行控制。
【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【转载请注明来源】数据的存取原创内容,盗版必究。
原创内容,盗版必究。【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】当一个事务开始之后,在它的生命周期以内,【关注微信公众号:wwwtangshuangnet】【转载请注明来源】你可以对 objectStore 进行数【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】据操作,数据操作无非是增删改查。前面介绍【转载请注明来源】【版权所有,侵权必究】过如何获取事务中的objectStore【未经授权禁止转载】【作者:唐霜】,现在,我们就用获取到的objectSt【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】ore进行数据操作。
【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net获取数据本文作者:唐霜,转载请注明出处。
【原创内容,转载请注明出处】【本文受版权保护】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】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是什么东东,只原创内容,盗版必究。未经授权,禁止复制转载。有在其onsuccess事件中才能得到获【作者:唐霜】【转载请注明来源】取到的结果。
【转载请注明来源】【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】添加数据原创内容,盗版必究。
著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。let transaction = db.transaction(['myObjectStore'], 'readonly')
let objectStore = transaction.objectStore('myObjectStore')
let request = objectStore.add({
id: '100002',
name: 'Zhang Fei',
})
添加数据使用add方法,传入一个obje【本文受版权保护】【本文受版权保护】ct。但是这个object有限制,它的主原创内容,盗版必究。未经授权,禁止复制转载。键值,也就是id值,不能是已存在的,如果【本文受版权保护】【本文受版权保护】objectStore中已经有了这个id【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。,那么会报错。因此,在某些程序中,为了避【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】免这种情况的发生,我们使用put方法。
【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 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,如果没有,未经授权,禁止复制转载。【转载请注明来源】则添加这个object。二,在另一种情况【原创不易,请尊重版权】【未经授权禁止转载】下,也就是设置了autoIncremen未经授权,禁止复制转载。转载请注明出处:www.tangshuang.nett为true的时候,也就是主键自增的时候著作权归作者所有,禁止商业用途转载。【转载请注明来源】,put方法必须传第二个参数,第二个参数著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。是主键的值,以此来确定你要更新的是哪一个【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】主键对应的object,如果不传的话,可本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】能会直接增加一个object到数据库中。转载请注明出处:www.tangshuang.net【未经授权禁止转载】从这一点上讲,自增字段确实比较难把握,因本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】此我建议开发者严格自己在传入时保证obj原创内容,盗版必究。【原创内容,转载请注明出处】ect中存在主键值。
本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】原创内容,盗版必究。删除数据未经授权,禁止复制转载。
【本文首发于唐霜的博客】【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】let transaction = db.transaction(['myObjectStore'], 'readonly')
let objectStore = transaction.objectStore('myObjectStore')
let request = objectStore.delete('100001')
delete方法把你传入的主键值对应的o【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。bject从数据库中删除。
【转载请注明来源】【本文受版权保护】本文作者:唐霜,转载请注明出处。IndexedDB API著作权归作者所有,禁止商业用途转载。
【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【作者:唐霜】未经授权,禁止复制转载。本节主要把indexedDB中最常用的所【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。有api进行列举,起到快速查阅的作用。注未经授权,禁止复制转载。原创内容,盗版必究。意,这里仅是最常用,基本可以覆盖90%的【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】使用场景,但并不代表所有的api都在这里转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】,你可以通过这里【未经授权禁止转载】查阅全部。未经授权,禁止复制转载。
【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net【转载请注明来源】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】I转载请注明出处:www.tangshuang.net D【转载请注明来源】 B【关注微信公众号:wwwtangshuangnet】 Database【原创内容,转载请注明出处】
【作者:唐霜】【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net
也就是本文最开始使用open打开inde转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】xedBD得到的db对象db,通过这节,了解这个idb有些什么接口可【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。以被调用。
let request = indexedDB.open(name, version)
request.onsuccess = (e) => {
let db = e.target.result // 获得db
}
name【版权所有】唐霜 www.tangshuang.net
【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】通过idb.name获取当前连接到的数据著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】库的名字。这和你在open的时候传入的n【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。ame是一致的。
【版权所有,侵权必究】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】version【版权所有,侵权必究】
【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。和你在open的时候传入的version著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。是一致的。
【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】【原创不易,请尊重版权】【原创不易,请尊重版权】objectStoreNames著作权归作者所有,禁止商业用途转载。
【本文受版权保护】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。获取当前数据库的所有objectStor【原创内容,转载请注明出处】【转载请注明来源】e的name列表,是一个数组。
著作权归作者所有,禁止商业用途转载。【作者:唐霜】【原创内容,转载请注明出处】【转载请注明来源】【本文首发于唐霜的博客】createObjectStore()【作者:唐霜】
【原创不易,请尊重版权】【转载请注明来源】转载请注明出处:www.tangshuang.net创建一个objectStore,有两个参【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。数:
本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【版权所有,侵权必究】- name:要创建的objectStore【原创不易,请尊重版权】原创内容,盗版必究。的name 【本文受版权保护】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】
- options:选项
【关注微信公众号:wwwtangshuangnet】
- keyPath:主键,你将要存入的obj本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】ect的一个property name,【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。比如每一个object都有一个id属性,原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net那么可以使用id作为keyPath,在查原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】询的时候,get方法的参数,是id值 【版权所有,侵权必究】未经授权,禁止复制转载。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net
- autoIncrement:keyPat本文作者:唐霜,转载请注明出处。原创内容,盗版必究。h是否自增,如果为true,那么你在添加转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】一个object的时候,可以不用传id,原创内容,盗版必究。【本文首发于唐霜的博客】id会自动加1。但是这样的话,你就不知道原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。你的这个object的id值到底是多少,【转载请注明来源】【转载请注明来源】所以不建议使用。默认为false 【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net
【原创不易,请尊重版权】【原创不易,请尊重版权】【本文受版权保护】
例子:未经授权,禁止复制转载。
【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。db.createObjectStore('students', { keyPaht: 'id', autoIncrement: false })
deleteObjectStore()转载请注明出处:www.tangshuang.net
【原创内容,转载请注明出处】【本文首发于唐霜的博客】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】删除一个objectStore,参数只有未经授权,禁止复制转载。【本文首发于唐霜的博客】一个:
未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net- name:要删除的objectStore【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。的name 转载请注明出处:www.tangshuang.net【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。
删除的时候,它的所有index也被删除了未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net。
【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】close()【转载请注明来源】
原创内容,盗版必究。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【本文受版权保护】关闭当前打开的这个数据库。关闭之后,任何【未经授权禁止转载】【转载请注明来源】操作都会报错。
转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。transaction()转载请注明出处:www.tangshuang.net
【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。重头戏,开启一个事务,是后续操作的开始。【未经授权禁止转载】【本文首发于唐霜的博客】前文已经讲过了,任何操作都是要在事务中进【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】行的,对于一个database而言,如果【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。要获取里面的数据,或者修改其中的某一个o【版权所有】唐霜 www.tangshuang.net【转载请注明来源】bjectStore,都要通过这个方法来著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net开启一个事务,在事务中进行操作。
著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】它有两个参数:本文版权归作者所有,未经授权不得转载。
【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】- objectStoreNames:一个数著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。组,表示你开启的这个事务,要准备对哪些o【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。bjectStore进行操作,在这个事务【版权所有,侵权必究】【作者:唐霜】中,只有这些objectStore能被选未经授权,禁止复制转载。原创内容,盗版必究。中,如果你选中其他的objectStor转载请注明出处:www.tangshuang.net【未经授权禁止转载】e,会报错。 【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net
- mode:读写权限,主要可用的值:rea【原创不易,请尊重版权】【作者:唐霜】donly, readwrite 未经授权,禁止复制转载。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。
我们用代码来看下用法:【原创内容,转载请注明出处】
本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。let tx = idb.transaction(['students'], 'readonly')
这样就获得了一个database的事务容【转载请注明来源】【转载请注明来源】器。
【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】database的api主要用到的就这些【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】了,接下来,我们来看下,开启事务之后,我【作者:唐霜】转载请注明出处:www.tangshuang.net们可以干什么。
原创内容,盗版必究。【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.netI【未经授权禁止转载】 D著作权归作者所有,禁止商业用途转载。 B著作权归作者所有,禁止商业用途转载。 Transaction【本文受版权保护】
本文作者:唐霜,转载请注明出处。【本文受版权保护】【本文受版权保护】转载请注明出处:www.tangshuang.net【作者:唐霜】
关于transaction的概念前面已经【原创不易,请尊重版权】原创内容,盗版必究。说了,这里主要看下,得到一个transa【版权所有】唐霜 www.tangshuang.net【转载请注明来源】ction之后可以干什么。
【原创不易,请尊重版权】未经授权,禁止复制转载。【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】db【访问 www.tangshuang.net 获取更多精彩内容】
【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】【未经授权禁止转载】获取这个transaction是对哪个d【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】atabase进行操作的事务。
未经授权,禁止复制转载。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netobjectStoreNames著作权归作者所有,禁止商业用途转载。
未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】【作者:唐霜】这个事务要对哪些objectStore进【本文受版权保护】【转载请注明来源】行操作,和你传入的objectStore【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】Names是一致的,是一个数组。
原创内容,盗版必究。【原创内容,转载请注明出处】【原创内容,转载请注明出处】【未经授权禁止转载】【未经授权禁止转载】mode原创内容,盗版必究。
本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】读写权限,和你传入的mode一致。【作者:唐霜】
【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。abort()【作者:唐霜】
本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】未经授权,禁止复制转载。【转载请注明来源】终止该事务,一旦人为终止,你程序中的某些【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】操作就不会再执行了。
【作者:唐霜】本文版权归作者所有,未经授权不得转载。【作者:唐霜】【本文首发于唐霜的博客】未经授权,禁止复制转载。objectStore()【访问 www.tangshuang.net 获取更多精彩内容】
【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【本文首发于唐霜的博客】获取事务中的某个objectStore的【作者:唐霜】本文作者:唐霜,转载请注明出处。容器。它有一个参数:
【本文首发于唐霜的博客】【本文受版权保护】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【作者:唐霜】- name:objectStore的nam本文版权归作者所有,未经授权不得转载。【本文受版权保护】e 原创内容,盗版必究。原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【未经授权禁止转载】
获得该objectStore容器之后,就本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。可以利用它进行objectStore的数本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。据增删改查了。
【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。let tx = idb.transaction(['students'], 'readonly')
let objStore = tx.objectStore('students')
// 利用objStore进行查询:
let request = objStore.get('100001')
注意,它的参数必须是在transacti【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。on的第一个参数数组中的。
著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【原创不易,请尊重版权】I【未经授权禁止转载】 D【本文受版权保护】 B转载请注明出处:www.tangshuang.net Object【版权所有,侵权必究】 Store【本文首发于唐霜的博客】
转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】
重头戏,objectStore是最核心的【未经授权禁止转载】【原创内容,转载请注明出处】概念了,它的容器,也就是上面这段代码中的objStore,都可以进行哪些后续操作呢?【转载请注明来源】
name【本文首发于唐霜的博客】
【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【作者:唐霜】获取该objectStore的name。【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。和创建的时候传入的name一致。
著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】keyPath原创内容,盗版必究。
【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net和创建的时候传入的keyPath一致。【访问 www.tangshuang.net 获取更多精彩内容】
【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【原创不易,请尊重版权】autoIncrement【本文受版权保护】
转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】和创建的时候传入的autoIncreme【转载请注明来源】本文作者:唐霜,转载请注明出处。nt一致。
本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【本文受版权保护】indexNames【本文首发于唐霜的博客】
转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net获取该objectStore的所有索引的本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。命名列表,和createIndex传入的【版权所有,侵权必究】【本文首发于唐霜的博客】第一个参数一致。
【版权所有,侵权必究】【本文首发于唐霜的博客】【本文首发于唐霜的博客】未经授权,禁止复制转载。原创内容,盗版必究。transaction未经授权,禁止复制转载。
著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【本文首发于唐霜的博客】获取该objectStore所属的tra本文作者:唐霜,转载请注明出处。【本文受版权保护】nsaction的容器。一个object【转载请注明来源】原创内容,盗版必究。Store的容器,只有在事务中才能得到,原创内容,盗版必究。【版权所有,侵权必究】因此这个objectStore的容器一定转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】属于某个事务,那么也就有对应的trans著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netaction容器。通过transacti【原创不易,请尊重版权】【作者:唐霜】on容器,其实可以做很多操作,比如获取和【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】该objectStore一起操作的其他o【作者:唐霜】【未经授权禁止转载】bjectStore的name。
未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【原创不易,请尊重版权】get()【关注微信公众号:wwwtangshuangnet】
著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。发起一个获取object的Request【未经授权禁止转载】【本文受版权保护】。Request我们还没有讲到,后面会讲本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】。它有一个参数:
【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】- key:主键的值,比如你要获取一个id=【原创内容,转载请注明出处】原创内容,盗版必究。100001的object,那么key应【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。该传入100001 【原创内容,转载请注明出处】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】
代码说话:【未经授权禁止转载】
【本文首发于唐霜的博客】【作者:唐霜】【本文首发于唐霜的博客】let objStore = tx.objectStore('students')
let request = objStore.get(100001)
而要得到最后查询到的object,需要在本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】request的onsuccess中获取本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。。所以后面讲完Request之后,你就能【关注微信公众号:wwwtangshuangnet】【作者:唐霜】正确使用代码了。
【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】add()【访问 www.tangshuang.net 获取更多精彩内容】
【本文首发于唐霜的博客】【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。发起一个添加object的Request著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】。它有一个参数:
本文作者:唐霜,转载请注明出处。【转载请注明来源】【原创不易,请尊重版权】未经授权,禁止复制转载。- object:要添加的object,ob【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。ject应该包含主键,这取决于autoI【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】ncrement是否为true 【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【本文受版权保护】
还是用代码来看下:【版权所有,侵权必究】
原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】【转载请注明来源】未经授权,禁止复制转载。let objStore = tx.objectStore('students')
let request = objStore.add({
id: '100002',
name: 'Li Hua',
})
delete()本文作者:唐霜,转载请注明出处。
本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【版权所有,侵权必究】发起一个删除object的Request【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。。它有一个参数:
转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。- key: 主键值,和get一样。【原创内容,转载请注明出处】 【本文首发于唐霜的博客】未经授权,禁止复制转载。【原创内容,转载请注明出处】
put()【原创不易,请尊重版权】
【原创内容,转载请注明出处】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net发起一个更新某个object的Reque转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】st。它有两个参数:
本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【未经授权禁止转载】- object:要更新的object【原创内容,转载请注明出处】 【本文受版权保护】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。
- key:要更新的object的主键值本文版权归作者所有,未经授权不得转载。 【转载请注明来源】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【转载请注明来源】
关于key非常难理解。当你在创建一个ob转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】jectStore的时候,你可能会传入a原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。utoIncrement为true,这时本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】,这个objectStore和我们经常使本文作者:唐霜,转载请注明出处。【本文受版权保护】用的有点不同。比如你的主键是id,那么如【作者:唐霜】【本文首发于唐霜的博客】果你在add或put的时候,不传这个id著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】,id值会自动加1,你get到的obje原创内容,盗版必究。未经授权,禁止复制转载。ct也会包含id属性。
著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【转载请注明来源】当你在使用put方法去更新的时候,如果你【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net的objectStore的autoInc本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】rement是true,就必须传入第二个【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。参数key,put方法会先通过key找到【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net该object,然后在用object的内原创内容,盗版必究。未经授权,禁止复制转载。容去更新。而如果不传key,那么你传入的【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。第一个参数object中必须包含id,否著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】则会报错。
【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】
但是如果你的autoIncrement【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。设置的是false,那就可以考虑忽略ke【未经授权禁止转载】本文作者:唐霜,转载请注明出处。y。但是效果还是不一样,当你传入key值【版权所有】唐霜 www.tangshuang.net【作者:唐霜】的时候,会更新传入的key对应的那个ob【本文受版权保护】【转载请注明来源】ject。不传的时候,根据你object本文作者:唐霜,转载请注明出处。【转载请注明来源】里面的主键来更新,没有的话会被认为是ad【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】d操作,不会报错。
所以比较好的一种操作是,不设置autoI著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】ncrement,无论是添加还是修改ob【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。ject,都使用put,只要开发者自己注【转载请注明来源】【版权所有】唐霜 www.tangshuang.net意,传入的object一定要有一个主键即【作者:唐霜】【转载请注明来源】可。这样当存在该主键值时,就更新,不存在本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】时就插入。这比使用add好很多,因为ad本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。d的时候,如果存在会报错。
著作权归作者所有,禁止商业用途转载。【作者:唐霜】转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net如果你还有不理解的地方,欢迎在下方留言,转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。对这个问题进行探讨。
【本文受版权保护】【本文受版权保护】【转载请注明来源】count()【本文受版权保护】
【作者:唐霜】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【未经授权禁止转载】没有参数,发起一个查询当前objectS原创内容,盗版必究。本文作者:唐霜,转载请注明出处。tore的所有object的数量的Req【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.netuest。
著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【原创内容,转载请注明出处】原创内容,盗版必究。clear()【原创不易,请尊重版权】
本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net没有参数,发起一个删除objectSto【版权所有,侵权必究】【作者:唐霜】re里面的所有object的Reques【本文受版权保护】本文作者:唐霜,转载请注明出处。t。
【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net【作者:唐霜】清除数据之前请备份好数据。【作者:唐霜】
未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】openCursor()【原创不易,请尊重版权】
【原创内容,转载请注明出处】【转载请注明来源】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。发起一个打开游标的Request。它的参【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。数统一在IDBCursor中讲。
转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netindex()【本文受版权保护】
本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【作者:唐霜】【本文受版权保护】【未经授权禁止转载】通过index方法,可以建立一个类似SQ【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。L数据库中视图。它先得到一个IDBInd本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】ex,然后你在对这个IDBIndex进行本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】操作。因此它不是发起一个Request,【本文受版权保护】【本文受版权保护】这有别于前面的方法。返回的IDBInde【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】x会在下文详细描述它的API。index转载请注明出处:www.tangshuang.net原创内容,盗版必究。方法由一个参数:
【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。- indexName:要用来作为索引视图的【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】索引名称 【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。
看下代码怎么用:【本文首发于唐霜的博客】
【访问 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,而是直接进行操作,【版权所有,侵权必究】【转载请注明来源】并且返回一个IDBIndex。关于IDB【作者:唐霜】【原创内容,转载请注明出处】Index,我会在Request后面再讲【原创内容,转载请注明出处】【版权所有,侵权必究】。它有三个参数:
【本文受版权保护】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【作者:唐霜】- indexName:索引的名字,自己规定【原创不易,请尊重版权】【转载请注明来源】的,后面作为根据索引进行查询的依据 转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【转载请注明来源】本文版权归作者所有,未经授权不得转载。
- keyPath:该索引对应object中未经授权,禁止复制转载。原创内容,盗版必究。的那个属性名,最好indexName和k转载请注明出处:www.tangshuang.net【作者:唐霜】eyPath相等,这样便于记忆 【转载请注明来源】【作者:唐霜】未经授权,禁止复制转载。
- objectParameters:
【转载请注明来源】
- unique:这个索引是否是唯一,也就是未经授权,禁止复制转载。【原创不易,请尊重版权】说所有object中,该属性值不能重复 【作者:唐霜】转载请注明出处:www.tangshuang.net【作者:唐霜】
原创内容,盗版必究。原创内容,盗版必究。转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】
虽然objectParameters还有【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。其他选项,但是常用的就是unique。
【版权所有,侵权必究】【作者:唐霜】原创内容,盗版必究。注意,只能在onupgradeneede【版权所有,侵权必究】未经授权,禁止复制转载。d中使用。
【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【本文首发于唐霜的博客】未经授权,禁止复制转载。未经授权,禁止复制转载。deleteIndex()【未经授权禁止转载】
【本文受版权保护】未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【转载请注明来源】【本文首发于唐霜的博客】删除一个索引,也不用发起Request。【原创不易,请尊重版权】原创内容,盗版必究。它有一个参数:
【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】- name:要删除的索引的name,和cr著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。eateIndex的时候传入的index【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】Name一致。 【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】【版权所有,侵权必究】【本文首发于唐霜的博客】
删除索引之后,就不能再根据索引查询数据了【未经授权禁止转载】本文作者:唐霜,转载请注明出处。。
本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】【未经授权禁止转载】另外需要注意,创建和删除索引,都需要在打【本文首发于唐霜的博客】【未经授权禁止转载】开db的Request的onupgrad未经授权,禁止复制转载。转载请注明出处:www.tangshuang.neteneeded事件中完成。
【作者:唐霜】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.netIDBRequest【本文受版权保护】
【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。【本文受版权保护】前面一直强调事务的概念,没有对Reque转载请注明出处:www.tangshuang.net【本文受版权保护】st进行介绍。Request是在事务过程未经授权,禁止复制转载。【原创内容,转载请注明出处】中,发起某项操作的请求。一个事务过程中,【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。可以有多个Request,Request【本文受版权保护】【转载请注明来源】一定存在与事务中,因此它肯定会有一个tr【原创内容,转载请注明出处】【转载请注明来源】ansaction属性来获取它所属于的那【未经授权禁止转载】【本文首发于唐霜的博客】个事务的容器。
【本文受版权保护】【未经授权禁止转载】【未经授权禁止转载】【作者:唐霜】著作权归作者所有,禁止商业用途转载。目前,在indexedDB中,有四种可能【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】产生Request:open datab【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。ase,objectStore requ本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netest, cursor request,未经授权,禁止复制转载。【本文首发于唐霜的博客】 index request。
【本文首发于唐霜的博客】【未经授权禁止转载】【版权所有,侵权必究】【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netreadyState转载请注明出处:www.tangshuang.net
【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】【本文受版权保护】【原创不易,请尊重版权】Request的状态。只有两种状态:pe著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】nding, done。
本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.nettransaction【原创不易,请尊重版权】
转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【本文受版权保护】获取该Request所属于的transa著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netction。
未经授权,禁止复制转载。【未经授权禁止转载】本文作者:唐霜,转载请注明出处。source未经授权,禁止复制转载。
【作者:唐霜】【转载请注明来源】【原创内容,转载请注明出处】获取该Request是由谁发起的,它可能【未经授权禁止转载】【原创不易,请尊重版权】有四种情况:objStore, curs转载请注明出处:www.tangshuang.net【版权所有,侵权必究】or, index, null. 当该R转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。equest是open database【本文首发于唐霜的博客】【版权所有,侵权必究】的时候发起,source值为null。
著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】原创内容,盗版必究。【转载请注明来源】通过该source值,其实可以获取更多信【转载请注明来源】本文作者:唐霜,转载请注明出处。息,比如objectStore的其他信息著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。。
【原创内容,转载请注明出处】【版权所有,侵权必究】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【转载请注明来源】result【访问 www.tangshuang.net 获取更多精彩内容】
本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】获取该Request的输出结果。该值最开【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。始是undefined,只有当Reque本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】st成功之后,该值才会出现。因此,要获取【转载请注明来源】【作者:唐霜】一个get的最终结果,必须在Reques【本文受版权保护】【关注微信公众号:wwwtangshuangnet】t的onsuccess事件中调用:
本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【转载请注明来源】【本文首发于唐霜的博客】let request = objectStore.get(10001)
request.onsuccess = e => {
let item = request.result
// 等价于
let item = e.tareget.result
}
IDBIndex【作者:唐霜】
【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【转载请注明来源】索引的概念就不讲了,这里主要是把最常用的著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。有关所有的api列举出来,方便使用。
【原创内容,转载请注明出处】【本文首发于唐霜的博客】【版权所有,侵权必究】什么情况下会产生IDBIndex呢?当调【原创不易,请尊重版权】未经授权,禁止复制转载。用一个objectStore的index【作者:唐霜】本文作者:唐霜,转载请注明出处。方法时,前文在讲IDBObjectSto本文作者:唐霜,转载请注明出处。【本文受版权保护】re的时候已经讲到过了。
【作者:唐霜】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。let objStore = tx.objectStore('students')
let objIndex = objStore.index('name')
通过index方法之后,这个objInd【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netex可以进行哪些操作呢?
未经授权,禁止复制转载。【本文受版权保护】【版权所有,侵权必究】【版权所有,侵权必究】name原创内容,盗版必究。
原创内容,盗版必究。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】该属性可以获取index的name。著作权归作者所有,禁止商业用途转载。
【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】keyPath著作权归作者所有,禁止商业用途转载。
【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。该属性可以获取index的keyPath转载请注明出处:www.tangshuang.net【未经授权禁止转载】,也就是object的某个属性的名字。这【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。个你在createIndex的时候传入的本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。keyPath是一致的。
【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。unique【关注微信公众号:wwwtangshuangnet】
转载请注明出处:www.tangshuang.net【本文受版权保护】著作权归作者所有,禁止商业用途转载。返回是否是唯一的,和你createInd【本文受版权保护】本文版权归作者所有,未经授权不得转载。ex的时候传入的值是一致的。
【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。isAutoLocale著作权归作者所有,禁止商业用途转载。
【作者:唐霜】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】返回一个boolean值,它表示这个in【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】dex是否是自增的,和前面的autoIn【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。crement有关。
未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netlocale未经授权,禁止复制转载。
【本文首发于唐霜的博客】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。如果这个index对应的字段是自增的,那【未经授权禁止转载】未经授权,禁止复制转载。么现在的自增基础值是多少?比如你的id是未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net自增的,现在objectStore里面有【转载请注明来源】未经授权,禁止复制转载。10个object,这时objIndex【转载请注明来源】【本文首发于唐霜的博客】.locale应该是10.
【未经授权禁止转载】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。objectStore本文作者:唐霜,转载请注明出处。
【原创不易,请尊重版权】【本文受版权保护】【本文首发于唐霜的博客】因为IDBIndex总是通过object著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.netStore的index方法产生的,所以它本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】自然会有对应的那个objectStore著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】,而自己的objectStore属性正好【作者:唐霜】【版权所有,侵权必究】是一个引用,指向那个产生自己的objec著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】tStore。
【作者:唐霜】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】count()著作权归作者所有,禁止商业用途转载。
【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net发起一个当前index视图总共有多少个o【转载请注明来源】【作者:唐霜】bject的Request。
未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【作者:唐霜】【作者:唐霜】【作者:唐霜】get()未经授权,禁止复制转载。
著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【作者:唐霜】发起一个从当前index获取一个值为传入本文作者:唐霜,转载请注明出处。【作者:唐霜】参数的object的Request。它有【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】一个参数:
【本文受版权保护】【作者:唐霜】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】- key: 这个key其实是指你的inde【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netx的keyPath的值 未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。
这里的key有点难理解,前面object本文作者:唐霜,转载请注明出处。【本文受版权保护】Store的get方法传入的是主键的值,本文版权归作者所有,未经授权不得转载。【作者:唐霜】而这类的get传入的是你选择的这个索引对【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】应的属性的值。比如说:
未经授权,禁止复制转载。【版权所有】唐霜 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。它的参【未经授权禁止转载】【本文受版权保护】数统一在IDBCursor中讲。
著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】原创内容,盗版必究。可以看出,objIndex对于objSt【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。ore而言,方法少了很多,它不能更新、删【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】除等。但是实际上,通过objectSto【作者:唐霜】【未经授权禁止转载】re属性,就可以反过来对objectSt【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。ore进行操作。
本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【未经授权禁止转载】IDBCursor【关注微信公众号:wwwtangshuangnet】
【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。游标通过前文的阐述,应该比较容易理解了。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。这里我们来看下,一个cursor都可以进【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】行哪些操作。
未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【转载请注明来源】但是在开始之前,你要回头看下游标是怎么得【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net到的?
【原创不易,请尊重版权】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。openCursor()【本文受版权保护】
本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。objectStore或objectIn原创内容,盗版必究。【版权所有,侵权必究】dex可以使用这个方法打开一个游标的Re【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.netquest。它有两个参数:
著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】【版权所有,侵权必究】- range:游标的值域,也就是说,游标在【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】遍历过程中,仅对值域范围内的那些obje【作者:唐霜】【本文首发于唐霜的博客】ct进行遍历 【原创不易,请尊重版权】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】
- direction:遍历的方向,有如下选转载请注明出处:www.tangshuang.net【转载请注明来源】择:next,nextunique,pr【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.netev,prevunique。看名字应该就本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】可以理解了。 未经授权,禁止复制转载。【本文首发于唐霜的博客】原创内容,盗版必究。【未经授权禁止转载】
打开游标后,游标怎么获得呢?在Reque【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。st的onsuccess中得到的:
著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netobjStore.openCursor().onsuccess = e => {
let cursor = e.target.result // 这个才是我们要的游标
}
接下来就是看看,这个cursor有哪些接【作者:唐霜】【未经授权禁止转载】口。
转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【转载请注明来源】direction转载请注明出处:www.tangshuang.net
本文作者:唐霜,转载请注明出处。【本文受版权保护】本文版权归作者所有,未经授权不得转载。游标遍历的方向,方向前面说过了,和你op【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】enCursor的时候传入的是一致的。
未经授权,禁止复制转载。【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。key【关注微信公众号:wwwtangshuangnet】
原创内容,盗版必究。【本文受版权保护】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。把当前游标所在的那个object的值返回原创内容,盗版必究。【未经授权禁止转载】给你,这个值是你使用index方法时,选【关注微信公众号:wwwtangshuangnet】【作者:唐霜】择的那个索引对应的属性的值。有点绕,举个未经授权,禁止复制转载。【本文首发于唐霜的博客】例子,如果游标当前停留在:
未经授权,禁止复制转载。【本文受版权保护】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。{
id: 2,
name: 'sue',
}
而你开启这个游标,又是通过原创内容,盗版必究。objStore.index('name').openCursor()开启的,那么这个时候这个key值,就是s著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.netue了。
primaryKey原创内容,盗版必究。
转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。游标遍历所在位置的object的主键。这【本文受版权保护】本文版权归作者所有,未经授权不得转载。个比较难理解,key和primaryKe本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。y的区别主要体现在你用索引进行检索的时候【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】,如果你openCursor是在非索引集【版权所有,侵权必究】【原创不易,请尊重版权】合情况下,其实key和primaryKe【原创不易,请尊重版权】原创内容,盗版必究。y是一样的,因为都是以主键作为索引。但是原创内容,盗版必究。未经授权,禁止复制转载。当你用index方法筛选出子集,那么这个本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。时候primaryKey在某些情况下就非转载请注明出处:www.tangshuang.net【作者:唐霜】常有必要知道。
本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.netsource【版权所有,侵权必究】
【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。【转载请注明来源】【版权所有】唐霜 www.tangshuang.net该属性返回开启游标的容器的引用,也就是o原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。bjStore或objIndex。
【版权所有,侵权必究】【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】value转载请注明出处:www.tangshuang.net
著作权归作者所有,禁止商业用途转载。【作者:唐霜】【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。改属性返回当前遍历到的object,严格【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net的说,这个属性是IDBCursorWithValue的属性。著作权归作者所有,禁止商业用途转载。
continue()本文版权归作者所有,未经授权不得转载。
【本文受版权保护】【原创不易,请尊重版权】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】游标往下移动一格或移动到你规定的位置。注本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。意,它是根据你规定的方向进行移动的。它可【原创内容,转载请注明出处】【本文首发于唐霜的博客】以有一个参数:
【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net- key:你想要移动游标到指定位置的值。比【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net如说你想让游标移动到id=4的那个obj【版权所有,侵权必究】【未经授权禁止转载】ect,那么这里传入4. 【本文受版权保护】【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】
advance()【原创内容,转载请注明出处】
【作者:唐霜】【版权所有,侵权必究】未经授权,禁止复制转载。continue()是只移动一格,adv本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.netance()可以自己规定移动的格数。它有【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net一个参数:
本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。未经授权,禁止复制转载。- count:你规定的往前移动的格数。【未经授权禁止转载】 著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【版权所有,侵权必究】【转载请注明来源】
continuePrimaryKey()
【原创内容,转载请注明出处】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【原创内容,转载请注明出处】前面讲了primaryKey这个属性,也本文作者:唐霜,转载请注明出处。【作者:唐霜】讲了continue(key)这个方法的本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。参数key。但是,当你在openCurs【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。or的时候,索引的值可重复时,那就会出现【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】尴尬的情况。在objectStore里面【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】存储数据的时候,primaryKey和其本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】他索引的key,它们的值可能是重复的,但【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。是如果通过两个key的值来确定呢?那么就未经授权,禁止复制转载。【版权所有,侵权必究】能更准确的定位某一个object。因此,本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net当你使用continuPrimaryKe转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。y的时候,是为了解决这个问题,即cont原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。inue()只会根据参数,往下移动到下一未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】个给定参数值的object,而如果使用c【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.netontinuePrimaryKey(),【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net那么在往下一个给定值移动时,还会再考虑p【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】rimaryKey的值。
【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【本文受版权保护】一般来说primaryKey的值都是唯一【本文受版权保护】【版权所有】唐霜 www.tangshuang.net的,但也不排除有些情况不唯一的时候,这个【版权所有,侵权必究】【未经授权禁止转载】时候,使用游标结合continuePri原创内容,盗版必究。【原创内容,转载请注明出处】maryKey才能正确获得你想要的那个o【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。bject,通过普通的get只能得到第一【本文首发于唐霜的博客】原创内容,盗版必究。个object。
【本文受版权保护】【未经授权禁止转载】【转载请注明来源】delete()本文版权归作者所有,未经授权不得转载。
【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【转载请注明来源】发起一个删除当前游标所在的object的本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】Request。删除之后,就要考虑用co【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。ntinuePrimaryKey(),而著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。不是continue()。
【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【转载请注明来源】【关注微信公众号:wwwtangshuangnet】update()未经授权,禁止复制转载。
【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。发起一个更新当前游标所在的这个objec著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.nett的对应字段的值的Request。它有一【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】个参数:
本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】- value:要用这个新的值替换掉老的值。本文作者:唐霜,转载请注明出处。【未经授权禁止转载】注意,不是替换掉整个object,而只是【原创内容,转载请注明出处】【本文受版权保护】更新你选中的那个key的值。 未经授权,禁止复制转载。【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】
小结【作者:唐霜】
著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】未经授权,禁止复制转载。【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net本文所有的内容就讲完了,本文从 Inde本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】xedDB 的概念和结构开始,把所有常用【原创内容,转载请注明出处】【版权所有,侵权必究】的 API 都讲了一遍,并且还给出了很多【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】例子。
本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。
有人做过一个预测,Web SQL 数据【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】库已经从标准中移除了,有可能在后面的浏览【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。器版本中被去除,IndexedDB 将有【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net可能统一浏览器本地化存储的数据库。
虽然本文对大部分 IndexedDB 的【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】接口都进行了讲解,但是还只是入门教程,还著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】有很多东西没讲。举个例子,作为数据库,最本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。重要的就是检索功能,也就是索引检索的那个【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】部分,但是本文并没有对这个部分展开。索引本文作者:唐霜,转载请注明出处。原创内容,盗版必究。检索还可以实现阈值检索,比如检索某一段日【原创内容,转载请注明出处】未经授权,禁止复制转载。期内的所有 object,比如检索所有同【本文受版权保护】【关注微信公众号:wwwtangshuangnet】姓氏的同学,这些问题都是经常遇到的,但都著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net不再本文的讲解范围内。想要完全了解 in著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.netdexedDB,还需要你继续深入学习。
转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【转载请注明来源】【本文受版权保护】原创内容,盗版必究。参考文献【本文受版权保护】
未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】- HTML5 indexedDB前端本地存本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。储数据库实例教程 【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net
- indb著作权归作者所有,禁止商业用途转载。 可能是最便捷的 indexedDB 操【原创不易,请尊重版权】【转载请注明来源】作库 转载请注明出处:www.tangshuang.net【本文受版权保护】转载请注明出处:www.tangshuang.net【作者:唐霜】转载请注明出处:www.tangshuang.net
- Dexie.js转载请注明出处:www.tangshuang.net 将 indexeddb 封装成类 sq【版权所有】唐霜 www.tangshuang.net【作者:唐霜】l 操作的库 著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【本文受版权保护】
如果你觉得本书对你有帮助,通过下方的二维码向我打赏吧,帮助我写出更多有用的内容。

2017-09-09 | indexedDB
文章中的部分图片失效了
CDN域名证书过期了,已经修复
最近在做ChatGPT相关的一个项目,想在浏览器本地保存聊天记录,才知道了有内置 indexedDB 这个数据库,在尝试之后发现好难用!
在网上搜索到了 Dexie.js 封装了相关的 API,找中文教程时顺藤摸瓜找到了博主的文章,非常感谢您,写得很详细,很多我不理解东西都被讲明白了,今晚尝试一下!
我想请教一个问题,indexdb上存储的数据怎么可以转移到另外一个pc端(假设数据量比较大,除了通过将数据全部查询出来,然后再一条一条导入新的的pc端,还有什么好的办法吗?)
indexeddb属于本地持久化存储,它设计的目标就是本地存储,不是共享,如果你是要共享数据,应该是搭数据服务,如果只是为了做数据迁移,目前没有更好的办法,自己写个程序把库导出为一个json,再发送给另外一个用户写个导入程序
感谢教程。
感謝大大分享
非常實用且完整
解釋淺顯易懂
讓在網路上自學的我收穫匪淺
关于版本那一块,好像文中也没有详细解释了,如果有时间,还请写一下呀
> 这时你会想,如果我从新的version切换为老的version,还可以在老的version里面添加数据吗?这个问题我们暂时保留。
在文章中添加来补充内容,关于降级我没有实际测试过,如果你有兴趣对话,可以试一下。
代码都被压成一行了。。大佬有时间改下么
谢谢提醒