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

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