InDB开发文档
前言【版权所有,侵权必究】
著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【转载请注明来源】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netindexedDB是HTML5标准,是前【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】端实现结构化数据存储的最关键因素。基于i【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。ndexedDB驱动,前端应用可以做到更【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。加厉害的应用体验。和localStora未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。ge相比,indexedDB的最主要优势【本文受版权保护】原创内容,盗版必究。在于,indexedDB是一个完整的数据【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】库模型,它具有数据库应该有的库表结构,丰原创内容,盗版必究。【原创内容,转载请注明出处】富的查询方式等等。除此之外,localS【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.nettorage的容量在5M左右,而inde【未经授权禁止转载】【未经授权禁止转载】xedDB达到惊人的500M。index【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。edDB还有可以存储arraybuffe【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】r,进程为异步等特征,这些特质都使得使用【版权所有】唐霜 www.tangshuang.net【作者:唐霜】indexedDB作为前端数据存储的不二转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net之选,localStorage降级为用于【本文受版权保护】著作权归作者所有,禁止商业用途转载。存储散列的快速读取配置项的存储工具。
【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】原创内容,盗版必究。但是,indexedDB有一个缺点,由于未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。它需要支持完整的数据库驱动模型,因此,a【作者:唐霜】【版权所有】唐霜 www.tangshuang.netpi较为复杂,概念也是一层套一层。我写过本文作者:唐霜,转载请注明出处。【未经授权禁止转载】《indexedDB中文教程【版权所有,侵权必究】》较为全面的去介绍它,然鹅,当我发现了新【转载请注明来源】著作权归作者所有,禁止商业用途转载。知识之后,还在不断的去补充那篇教程,可见【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net,如果一个初级开发者要使用原生的inde【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。xedDB api去写代码,会是一件痛苦原创内容,盗版必究。本文作者:唐霜,转载请注明出处。的事。为了解决这个痛点,我决意写一个优秀【本文受版权保护】【版权所有,侵权必究】的indexedDB操作库。虽然市面上已本文作者:唐霜,转载请注明出处。原创内容,盗版必究。经有很多库了,但是它们很多都基于inde转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。xedDB原生操作理念去实现,另有一些,【本文受版权保护】【未经授权禁止转载】特意想要套用sql的理念,导致使用反而更【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】难理解。我经过反复摸索,发布了InDB,未经授权,禁止复制转载。【原创内容,转载请注明出处】它即遵循了indexedDB原生开发的一【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。些乐趣,开发者再使用它时,可以返回去理解未经授权,禁止复制转载。【原创不易,请尊重版权】indexedDB原生接口,但同时,使用著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net它你又可以非常轻松的使用indexedD【关注微信公众号:wwwtangshuangnet】【作者:唐霜】B,无需太多复杂的理解。
【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。那么InDB到底有多简单呢?这篇文章全面本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。的去介绍它的使用方法。
本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】关注我博客的同学可能在之前接触过我发布的【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】HelloIndexedDB,InDB沿【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。袭了它的使用习惯和风格,但是有一些方法在著作权归作者所有,禁止商业用途转载。【作者:唐霜】具体使用上稍有不同。InDB拆分了“DB原创内容,盗版必究。【本文首发于唐霜的博客】”和“Store”两个概念,使用 InD未经授权,禁止复制转载。未经授权,禁止复制转载。B 只是连接上数据库,需要调用 use 【未经授权禁止转载】【未经授权禁止转载】方法才能使用 store。
原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】
基础概念著作权归作者所有,禁止商业用途转载。
著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】虽然InDB最简化了indexedDB的【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】操作,但是,由于indexedDB和lo【原创内容,转载请注明出处】【版权所有,侵权必究】calStorage完全不同,所以,关于未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】这个数据库的基本概念要事先了解。
本文作者:唐霜,转载请注明出处。【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【作者:唐霜】对于一个数据库引擎,我们要记录一条数据,【作者:唐霜】【版权所有】唐霜 www.tangshuang.net首先需要打开一个数据库,然后在这个数据库【关注微信公众号:wwwtangshuangnet】【作者:唐霜】里面选择一个store(也就是sql数据本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】库里面的表),之后才能进行增删改查的工作【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】。indexedDB完整的继承这一模型,【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】你需要了解,在使用InDB时,有“数据库【作者:唐霜】【版权所有】唐霜 www.tangshuang.net”“store”“记录”这三层概念存在,转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】具体反应到代码中,这三个概念会在实例化参【版权所有,侵权必究】转载请注明出处:www.tangshuang.net数中反应出来。
著作权归作者所有,禁止商业用途转载。【本文受版权保护】【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net其次是关于keyPath的概念。inde本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】xedDB存的数据和localStora未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netge结构不一样,localStorage【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】存的是键值对,而indexedDB存的是【原创内容,转载请注明出处】【原创内容,转载请注明出处】object,也就是js对象。就像sql未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net里面一样,要找到一条记录需要通过它的字段【本文首发于唐霜的博客】【未经授权禁止转载】去查,而在indexedDB中,被存的o【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】bject的属性名就相当于字段名,属性值本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】就相当于字段值。而keyPath简单的讲【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net就是object的(某个)属性名。但是,著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。indexedDB的强大之处在于,key转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netPath可以是链式的多级属性。比如有一个转载请注明出处:www.tangshuang.net【转载请注明来源】person对象里面深层级的值可以用pe【本文首发于唐霜的博客】【转载请注明来源】rson.body.head.left_本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.neteye获得,而这个时候”bo著作权归作者所有,禁止商业用途转载。【本文受版权保护】dy.head.left_eyeR著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。21;就是这个值相对于person对象的【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netkeyPath。(而在某些场景中,为了简原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】化描述,甚至直接将“keyPath”作为本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net“keyPath的值”给简写了。)
【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。再次是关于key的概念。indexedD转载请注明出处:www.tangshuang.net原创内容,盗版必究。B的key的概念有点别扭,它代表的是键值【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。,而非键名。
转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】最后是关于索引的概念。indexedDB未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。如其名,它的特色就是index(索引)。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。indexedDB具备了强大的索引系统,【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net它根据keyPath创建索引,根据ind【未经授权禁止转载】【版权所有,侵权必究】exName查询对象记录,可以对一个in【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】dexName设置多个keyPath,而【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】且还可以实现值域查询。总而言之,如果你想【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net利用indexeDB快速查询数据,那么索著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】引要好好利用。
转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。以上就是你在使用InDB之前必须了解的概【转载请注明来源】原创内容,盗版必究。念。其他indexedDB原生概念可以暂本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】时不用了解。
【作者:唐霜】【转载请注明来源】【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。快速入门【关注微信公众号:wwwtangshuangnet】
【本文受版权保护】【本文首发于唐霜的博客】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net本节让你快速使用InDB进行数据的存取。
转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net包的安装和使用【原创不易,请尊重版权】
【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。【转载请注明来源】InDB是一个npm包,通过npm进行安著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】装:
【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】npm i indb
安装之后,你可以根据你的编程需求选择不同原创内容,盗版必究。【本文受版权保护】的使用方式:
原创内容,盗版必究。【本文首发于唐霜的博客】【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net// webpack import InDB from 'indb'
// CommonJS
const { InDB } = require('indb')
在HTML中直接使用时,你需要把indb【本文首发于唐霜的博客】【未经授权禁止转载】/dist/indb.js文件拷贝到你的【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net本地目录:
著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。<script src="./node_modules/indb/dist/indb.js"></script>
<script>
const { InDB } = window['indb'] // 注意这里的使用方法
</script>
使用著作权归作者所有,禁止商业用途转载。
【作者:唐霜】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】接下来,你就可以像localStorag本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。e一样,使用这个store,不过,由于i【关注微信公众号:wwwtangshuangnet】【转载请注明来源】ndexedDB是异步操作的,你的所有操【本文首发于唐霜的博客】原创内容,盗版必究。作都必须是异步完成。
【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【本文受版权保护】本文版权归作者所有,未经授权不得转载。let obj = await store.getItem('key')
await store.setItem('key', 'value')
这样我们就完成了对InDB的初步认识。下未经授权,禁止复制转载。【未经授权禁止转载】文,我们会分开详细介绍它的各个细节方面。
原创内容,盗版必究。【本文首发于唐霜的博客】【版权所有,侵权必究】实例化参数著作权归作者所有,禁止商业用途转载。
转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【原创不易,请尊重版权】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。这一节将会是InDB整个使用中最难的部分【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net,一旦掌握了本节的内容,其他的方面完全就【转载请注明来源】【版权所有】唐霜 www.tangshuang.net无需担忧了。
【未经授权禁止转载】【原创内容,转载请注明出处】未经授权,禁止复制转载。在上一节的时候,我们直接使用InDB.g【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】etItem,这种做法是最简单的做法,但原创内容,盗版必究。【原创不易,请尊重版权】这样不能发挥出indexedDB的强大功【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。能,相当于把它当作一个localStor本文作者:唐霜,转载请注明出处。【作者:唐霜】age的替代品,没意思。本节我们学习实例著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】化参数,这些参数被用来作为对indexe【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.netdDB进行操作前的准备工作。
【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【版权所有,侵权必究】我们要使用InDB来操作indexedD本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。B,要经过步骤:
本文版权归作者所有,未经授权不得转载。【本文受版权保护】【转载请注明来源】【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。- 连接到数据库【转载请注明来源】 本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。
- 打开一个store【版权所有】唐霜 www.tangshuang.net 转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。
- 写入或修改数据【版权所有】唐霜 www.tangshuang.net 【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。
具体操作如下:【关注微信公众号:wwwtangshuangnet】
本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【未经授权禁止转载】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netconst idb = new InDB(options) // 实例化InDB,得到一个可以连接数据库的实例
const store = idb.use('store1') // 通过use方法,打开一个store
参数列表本文作者:唐霜,转载请注明出处。
原创内容,盗版必究。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net在进行InDB实例化时,需要传入参数:未经授权,禁止复制转载。
【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。- name: 字符串,数据库名称原创内容,盗版必究。 【未经授权禁止转载】【本文受版权保护】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net
- version: 正整数,数据库结构的版本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net本,调整数据库结构时,需要升级versi本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.neton 本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net
- stores: 数组,用以定义当前数据库【作者:唐霜】【版权所有】唐霜 www.tangshuang.net中每个store的结构
- name: 字符串,store名称【作者:唐霜】 【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】本文版权归作者所有,未经授权不得转载。
- keyPath: 字符串,store k原创内容,盗版必究。【转载请注明来源】eyPath 著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】原创内容,盗版必究。
- indexes: 数组,用以定义stor【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】e的索引
- name: 字符串,索引名称本文作者:唐霜,转载请注明出处。 转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【版权所有,侵权必究】
- keyPath: 字符串,索引的keyP【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】ath 【作者:唐霜】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。
- unique: boolean,该索引是【未经授权禁止转载】转载请注明出处:www.tangshuang.net否是唯一的,不允许同一个store中同索著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。引名存在两个及以上的索引值 本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】
【转载请注明来源】未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】
- isKv: boolean,是否开启ke【本文受版权保护】【版权所有】唐霜 www.tangshuang.nety-value模式,为true时keyP【转载请注明来源】【版权所有,侵权必究】ath和indexes无效 【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】
【版权所有,侵权必究】【原创不易,请尊重版权】【本文首发于唐霜的博客】
上面就是所有参数字段,看上去非常简单。但【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。是不要急,复杂的东西在后面。
【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】store的配置【版权所有】唐霜 www.tangshuang.net
转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【作者:唐霜】上面的stores参数是一个数组,而数组本文作者:唐霜,转载请注明出处。原创内容,盗版必究。的每一个元素,代表要创建怎样的一个sto【本文首发于唐霜的博客】【作者:唐霜】re出来。
【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【转载请注明来源】【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】{
name: store的名称,必填
keyPath: 主键名,也就是说,一个object的什么属性(路径)会被作为这个store的最主要查询依据
indexes: 索引列表
autoIncrement: 主键是否自增,设置为true时,在向store添加对象的时候,主键值可不传
isKv: 是否开启key-value模式,只有开启key-value模式的store才会拥有getItem/setItem/removeItem这几个方法,并且用这几个方法像操作localStorage一样操作indexedDB,不开启的情况下,不能使用这几个方法
}
上面比较难理解的是autoIncreme【本文首发于唐霜的博客】【未经授权禁止转载】nt,所以,我的建议是不设置这个值。
本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】index的配置【原创不易,请尊重版权】
著作权归作者所有,禁止商业用途转载。【转载请注明来源】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net上面的indexes配置项是个数组,而其【原创内容,转载请注明出处】【原创内容,转载请注明出处】中每个元素代表要给这个store创建怎样【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。的索引。
【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】{
name: index的name,查询的时候用到
keyPath: 索引对应object的什么属性(路径)
unique: 是否为唯一索引,为true的时候,整个store里面该keyPath对应的值不能有重复
}
上面比较难理解的是keyPath,ind原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】ex的keyPath和store的key【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】Path理解上不一样。index的key原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。Path是指,当你用index的name未经授权,禁止复制转载。未经授权,禁止复制转载。去查询的时候,实际要查询的object的【原创不易,请尊重版权】【作者:唐霜】属性名,indexName相当于是ind未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。exKeyPath的一个别名,方便在查询著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】的时候使用较短的字符串去代替。
本文版权归作者所有,未经授权不得转载。【本文受版权保护】【作者:唐霜】【转载请注明来源】基础API【版权所有】唐霜 www.tangshuang.net
【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。本节介绍通用API,利用这些api你可以【作者:唐霜】原创内容,盗版必究。快速操作indexedDB。这些方法全部【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】为实例化对象的方法,使用时,需先得到实例转载请注明出处:www.tangshuang.net【未经授权禁止转载】化对象。每个实例对应一个库,在进行操作时【转载请注明来源】本文版权归作者所有,未经授权不得转载。,一个操作只能对应一个store,不能同本文作者:唐霜,转载请注明出处。原创内容,盗版必究。时用一个实例操作多个store。你可以通【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】过use方法得到对不同store的实例,【转载请注明来源】【版权所有,侵权必究】通过它们来操作不同store。
【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】get本文作者:唐霜,转载请注明出处。
【原创内容,转载请注明出处】【本文受版权保护】【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。根据store的key获取一个对象。ke【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。y是keyPath的值。
本文作者:唐霜,转载请注明出处。【本文受版权保护】【转载请注明来源】【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。let value = await store.get(key)
- @param {String} key 【原创内容,转载请注明出处】未经授权,禁止复制转载。主键值,注意,是值,不是名 【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。
- @return {Object} val著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。ue 未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【版权所有,侵权必究】【本文首发于唐霜的博客】
add未经授权,禁止复制转载。
【原创不易,请尊重版权】原创内容,盗版必究。未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。向store中插入一条新记录。【访问 www.tangshuang.net 获取更多精彩内容】
转载请注明出处:www.tangshuang.net原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。await store.add({ id, name, age })
相当于sql中的insert操作,需要注【版权所有】唐霜 www.tangshuang.net【本文受版权保护】意,indexedDB中,对add的数据著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】格式有要求,必须符合下面其中之一
原创内容,盗版必究。转载请注明出处:www.tangshuang.net【转载请注明来源】本文版权归作者所有,未经授权不得转载。【转载请注明来源】- options中没有设置autoIncr未经授权,禁止复制转载。【本文首发于唐霜的博客】ement,在add的对象中,必须包含k【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】eyPath属性,且key值相同的记录不转载请注明出处:www.tangshuang.net【本文受版权保护】能存在于store中 【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。
- options中设置了autoIncer原创内容,盗版必究。本文作者:唐霜,转载请注明出处。ment为true,那么在add对象时,【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net不必传keyPath,add成功时,会自原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】动为该object加上该属性,并且保持自【本文首发于唐霜的博客】原创内容,盗版必究。增的效果 转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net
如果add的对象key值已经存在于sto【转载请注明来源】未经授权,禁止复制转载。re中,会报错,因此,比较常规的操作是用【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】put代替add。
原创内容,盗版必究。【本文受版权保护】【转载请注明来源】put转载请注明出处:www.tangshuang.net
【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【本文受版权保护】【转载请注明来源】更新store中的一条数据,如果传入对象本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】的key值不存在,就插入这条数据。
未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【转载请注明来源】【版权所有】唐霜 www.tangshuang.netawait store.put({ id, name, age })
put中key值其实也遵循上面add的规【本文受版权保护】【本文首发于唐霜的博客】律,如果autoIncrement设置为【本文受版权保护】【原创不易,请尊重版权】true,那么不给key时,就是添加,给【转载请注明来源】本文作者:唐霜,转载请注明出处。key时,就是更新。
【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【转载请注明来源】一般,在代码中我们尽量少使用autoIn【关注微信公众号:wwwtangshuangnet】【转载请注明来源】crement配置,因为我们很难完全掌握转载请注明出处:www.tangshuang.net【本文受版权保护】数据的实际情况。我们尽量使用put,而不原创内容,盗版必究。转载请注明出处:www.tangshuang.net是add,因为代码一旦部署,它就不能修改【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。,如果在执行中add报错,那么很可能阻塞【版权所有】唐霜 www.tangshuang.net【本文受版权保护】你的程序。
本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【原创不易,请尊重版权】未经授权,禁止复制转载。【版权所有,侵权必究】delete原创内容,盗版必究。
【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【原创不易,请尊重版权】从store中删除一条数据。转载请注明出处:www.tangshuang.net
【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】await store.delete(key)
传入key值。本文版权归作者所有,未经授权不得转载。
【作者:唐霜】【原创不易,请尊重版权】【本文受版权保护】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net以上是InDB中最基础的api,利用这些【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】api,就可以实现最基础的数据增删改查了【转载请注明来源】【作者:唐霜】。
著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】【转载请注明来源】remove【未经授权禁止转载】
转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【原创不易,请尊重版权】从store中删除一条数据,和delet【未经授权禁止转载】【版权所有,侵权必究】e不同的是,remove直接接收这个对象【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】。
【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】原创内容,盗版必究。【版权所有,侵权必究】await store.remove(obj)
它会自动去找到obj上的keyPath,原创内容,盗版必究。【作者:唐霜】然后用delete去删除。
未经授权,禁止复制转载。【转载请注明来源】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。另外,使用delete的时候,你需要传入本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】的是keyPath的值,而如果你的key未经授权,禁止复制转载。【本文首发于唐霜的博客】Path是多级路径,例如’b【原创内容,转载请注明出处】【本文首发于唐霜的博客】ody.hands’这样的路【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。径,那么要取到key也是挺麻烦的,你需要【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net自己有一套解析keyPath的工具。而I【原创内容,转载请注明出处】【作者:唐霜】nDB内置了这样的功能,使用remove【本文首发于唐霜的博客】未经授权,禁止复制转载。不用担心这个问题,只要你的obj是一个和【版权所有,侵权必究】【原创不易,请尊重版权】数据库中记录对应的上的对象,就能被正确删原创内容,盗版必究。【原创内容,转载请注明出处】除。
转载请注明出处:www.tangshuang.net原创内容,盗版必究。【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。clear本文版权归作者所有,未经授权不得转载。
【本文受版权保护】【原创内容,转载请注明出处】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】清空store中的所有数据,注意备份!!
本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。awiat store.clear()
查询API未经授权,禁止复制转载。
【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。基础api仅仅是最基础功能的实现,还没有【转载请注明来源】【版权所有】唐霜 www.tangshuang.net涉及indexedDB真正强大的地方。i本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。ndexedDB真正强大的地方是利用索引【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】进行查询,因此,我们要发挥这些能力,我们原创内容,盗版必究。未经授权,禁止复制转载。就会用到下面的api。
原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】原创内容,盗版必究。【转载请注明来源】本文版权归作者所有,未经授权不得转载。注意:依赖于 index 的查询 API原创内容,盗版必究。原创内容,盗版必究。 需要在创建仓库时传入对应的 index【作者:唐霜】原创内容,盗版必究。es,即使该属性已经被 keyPath 未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net使用,也要在 indexes 中再次声明本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】,否则无法使用下面的查询接口。
【未经授权禁止转载】【本文首发于唐霜的博客】原创内容,盗版必究。转载请注明出处:www.tangshuang.net
find本文作者:唐霜,转载请注明出处。
【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】【作者:唐霜】【本文首发于唐霜的博客】原创内容,盗版必究。从store中找到第一条indexNam【转载请注明来源】【原创不易,请尊重版权】e为某值的记录。
【本文受版权保护】本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。let obj = await store.find(indexName, value)
要使用find的前提是,你的store在【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】配置时传入了对应的index,否则是不能本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】根据索引找到值的。
【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】const store = new InDB({
name: 'my-idb',
stores: [
{
name: 'my-store',
keyPath: 'id',
indexes: [
{
name: 'indexName',
keyPath: 'age',
},
],
},
],
})
注意上面红色的部分,只有当你在创建sto【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netre的时候,设置了这个索引,才能使用fi未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】nd去使用它:
【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.netlet obj = await store.find('indexName', 10)
这样就可以找到第一条age=10的数据了【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net,相当于sql里面的where age=【未经授权禁止转载】转载请注明出处:www.tangshuang.net10 limit 1的子句。
本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【本文受版权保护】著作权归作者所有,禁止商业用途转载。注意,我这里传入的是indexName,【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。但是indexedDB实际会使用keyP【作者:唐霜】原创内容,盗版必究。ath,也就是’age【未经授权禁止转载】原创内容,盗版必究。217;字段作为查询条件。关于keyPa【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。th前面已经解释过了,这里不再赘述。
【转载请注明来源】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netquery本文作者:唐霜,转载请注明出处。
未经授权,禁止复制转载。【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】查询出store中所有满足条件的记录,返转载请注明出处:www.tangshuang.net【转载请注明来源】回一个数组。
【作者:唐霜】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。let objs = await store.query(indexName, value, compare)
find仅仅找到第一条数据,而query著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】则可以找出所有满足条件的记录。和find未经授权,禁止复制转载。原创内容,盗版必究。一样,它也必须是index支持的才能使用转载请注明出处:www.tangshuang.net【版权所有,侵权必究】。
【原创内容,转载请注明出处】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】let objs = await store.query('indexName', 10)
这样就可以查出age=10的所有记录。转载请注明出处:www.tangshuang.net
本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.netquery比find更强大的地方在于,它转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。支持条件筛选,它的第三个参数可以传入比较【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net运算符。
转载请注明出处:www.tangshuang.net原创内容,盗版必究。【本文首发于唐霜的博客】let objs = await store.query('indexName', 10, '>')
表示查出所有age>10的记录,支未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。持的条件如下:
【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net- > 大于原创内容,盗版必究。 【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】
- >= 大于等于【作者:唐霜】 【本文首发于唐霜的博客】未经授权,禁止复制转载。【版权所有,侵权必究】【原创不易,请尊重版权】【本文首发于唐霜的博客】
- < 小于【转载请注明来源】 著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】原创内容,盗版必究。
- <= 小于等于本文作者:唐霜,转载请注明出处。 著作权归作者所有,禁止商业用途转载。【作者:唐霜】本文版权归作者所有,未经授权不得转载。
- != 不等于本文版权归作者所有,未经授权不得转载。 【本文首发于唐霜的博客】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】
- = 等于,默认值原创内容,盗版必究。 【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】【原创内容,转载请注明出处】【本文受版权保护】【关注微信公众号:wwwtangshuangnet】
- % 包含,仅字符串生效,类比于sql中的著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】LIKE 【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【转载请注明来源】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。
- in 包含于,value必须是一个数组,【本文首发于唐霜的博客】【原创不易,请尊重版权】仅js基本数据类型有效,类比于sql中的【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】IN 【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】
在使用!=、%和in的时候一定要注意,由【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。于indexedDB内部还不支持这3种查【未经授权禁止转载】【作者:唐霜】询方式,但InDB可以支持。说到这里,可本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】以将index配置项里面都只配置name原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】属性,这样keyPath属性会自动使用n【作者:唐霜】【版权所有,侵权必究】ame属性。
【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【转载请注明来源】【版权所有】唐霜 www.tangshuang.netconst store = new InDB({
name: 'my-idb',
stores: [
{
name: 'my-store',
keyPath: 'id',
indexes: [
{
name: 'body.head', // 这样可以保证name和keyPath的值是一样的
},
],
},
],
})
不过上面也只是建议,最后根据你的实际情况【本文首发于唐霜的博客】未经授权,禁止复制转载。来确定。
著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netselect转载请注明出处:www.tangshuang.net
本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】查询出store中所有满足条件的记录,返未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。回一个数组。
【作者:唐霜】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】let objs = await store.select([
{ key: 'name', value: 'c', compare: '>' },
{ key: 'age', value: 10, compare: '>' },
{ key: 'age', value: 20, compare: '<' },
])
虽然indexedDB很强大,但是仅支持【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。单索引查询,而无法做到多个索引同时联系起【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。来查询。为了实现这一功能,我实现了sel【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】ect方法,这个方法可以让你同时使用多个【未经授权禁止转载】【作者:唐霜】查询条件,并且取一定的逻辑关系。例如上面本文作者:唐霜,转载请注明出处。【作者:唐霜】这段代码,它可以查询出name>&【版权所有】唐霜 www.tangshuang.net【本文受版权保护】#8217;c’同时10&l【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。t;age<20的所有记录。
【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】select接收一个数组,数组中的每个元【作者:唐霜】【版权所有,侵权必究】素都是一个查询条件,它可以包含如下属性:
【原创不易,请尊重版权】【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】原创内容,盗版必究。- key: 索引名称转载请注明出处:www.tangshuang.net 转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。
- value: 要查询的目标属性值转载请注明出处:www.tangshuang.net 著作权归作者所有,禁止商业用途转载。【本文受版权保护】本文版权归作者所有,未经授权不得转载。
- compare: 被检查记录和value著作权归作者所有,禁止商业用途转载。【转载请注明来源】之间的关系,比较符在query一节已经讲【转载请注明来源】【转载请注明来源】过了 【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【转载请注明来源】【本文首发于唐霜的博客】
- optional: 该条检索条件是否是可转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net选的,相当于sql里面的OR子句 【版权所有】唐霜 www.tangshuang.net【作者:唐霜】本文版权归作者所有,未经授权不得转载。
optional这个选项有点难理解,简单著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。的说,它就是sql里面的OR,而sele原创内容,盗版必究。【未经授权禁止转载】ct方法的查询方式非常简单,没有opti原创内容,盗版必究。原创内容,盗版必究。onal或者optional为false未经授权,禁止复制转载。未经授权,禁止复制转载。的,被认为是AND子句,先进行查询,所有著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。optional为true的被视为一个整本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】体,最后进行查询,在满足AND的基础上,本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。只有满足任意一条OR的子句的记录才会在结本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】果集合中,否则就不在。而如果你的条件里面原创内容,盗版必究。本文作者:唐霜,转载请注明出处。,全部都是optional为true,那【原创不易,请尊重版权】未经授权,禁止复制转载。么相当于只有一条AND语句,也就是说只要未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。记录满足任何一条规则,即可被返回。
【原创内容,转载请注明出处】【原创内容,转载请注明出处】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netlet objs = await store.select([
{ key: 'name', value: 'c', compare: '>' },
{ key: 'age', value: 10, compare: '<', optional: true },
{ key: 'age', value: 20, compare: '>', optional: true },
])
这条查询相当于 name>R【版权所有】唐霜 www.tangshuang.net【作者:唐霜】17;c’ AND (age【版权所有,侵权必究】【原创不易,请尊重版权】<10 OR age>20)【作者:唐霜】【本文首发于唐霜的博客】。所有类似的语句都能转化为 (a AND本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】 b AND c) AND (d OR 原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】e OR f) 这样的句子,你只要记住所本文作者:唐霜,转载请注明出处。原创内容,盗版必究。有条件被分为两组,AND 子句被视作一个【关注微信公众号:wwwtangshuangnet】【本文受版权保护】整体先判断,在成立的情况下,再把 OR 【转载请注明来源】【版权所有,侵权必究】子句被视作一个整体后判断,就可以轻松理解【未经授权禁止转载】【原创内容,转载请注明出处】了。
【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。但是,这样的查询没有办法做到 (a AN【转载请注明来源】著作权归作者所有,禁止商业用途转载。D b) OR (c AND d) 这样未经授权,禁止复制转载。【本文受版权保护】的查询,我们在业务中经常需要查询多个条件转载请注明出处:www.tangshuang.net【未经授权禁止转载】的并集,所以,我提供了一种方式来获得多个著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net条件的并集,即:你可以传入多个数组来作为【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。多个条件。语法如下:
【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】【转载请注明来源】【转载请注明来源】await store.select( [ ... ], [ ... ] )
通常情况下,你只会传入一个参数,但是在有未经授权,禁止复制转载。【作者:唐霜】取多个并集时,可以传入多个参数,每个参数【本文受版权保护】转载请注明出处:www.tangshuang.net的结构都是一样的。这样可以获得多个查询结未经授权,禁止复制转载。未经授权,禁止复制转载。果的并集。
【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】未经授权,禁止复制转载。【本文受版权保护】著作权归作者所有,禁止商业用途转载。但是,我没有提供 (a OR b) AN【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】D (c OR d) 这样的查询能力,你【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】需要把它转化为 (a AND c) OR本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。 (b AND d) 的查询,当然,这要【作者:唐霜】【未经授权禁止转载】根据实际情况来决定怎么组合在一起,而不是【本文受版权保护】未经授权,禁止复制转载。像我这里直接把 a&c b&am【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。p;d 组合在一起。举个例子,你需要查询【本文受版权保护】转载请注明出处:www.tangshuang.net年龄小于10或大于30,且体重小于40或本文作者:唐霜,转载请注明出处。【本文受版权保护】140的学生集合,正常的写法是 (age【本文受版权保护】【关注微信公众号:wwwtangshuangnet】<10 OR age>30)未经授权,禁止复制转载。【未经授权禁止转载】 AND (weight<40 O著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】R weight>140),但是我未经授权,禁止复制转载。【原创不易,请尊重版权】们不支持这种查询语法,此时,我们要分析具本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】体的需求,在草稿纸上画出两条查询之间的内原创内容,盗版必究。【原创内容,转载请注明出处】在逻辑,就可以知道它可以用 (age&l转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】t;10 AND weight<4【本文受版权保护】著作权归作者所有,禁止商业用途转载。0) OR (age>30 AND【版权所有,侵权必究】【原创不易,请尊重版权】 weight>140) 来表达。【本文受版权保护】【版权所有,侵权必究】当然,不是所有情况都是这样的,这需要你在【转载请注明来源】【版权所有】唐霜 www.tangshuang.net草稿纸上画出每条查询之间的联系。
【转载请注明来源】原创内容,盗版必究。【未经授权禁止转载】【本文首发于唐霜的博客】<---| 10 age 30 |--------> <----| 40 wieght 140 |--->
通过这种分析得到一个可用的语法。但是实际原创内容,盗版必究。转载请注明出处:www.tangshuang.net上,我们很少在业务中出现这种需求,毕竟我著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】们不是在做 SQL 的复杂查询。
本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【作者:唐霜】【原创不易,请尊重版权】注意:find、query、select【本文首发于唐霜的博客】未经授权,禁止复制转载。都要求你使用indexes配置才能使用。
【版权所有,侵权必究】【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.netfirst本文作者:唐霜,转载请注明出处。
原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【未经授权禁止转载】返回store中的第一条数据。【访问 www.tangshuang.net 获取更多精彩内容】
原创内容,盗版必究。【版权所有,侵权必究】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【作者:唐霜】let firstRecord = await store.first()
last【访问 www.tangshuang.net 获取更多精彩内容】
【未经授权禁止转载】【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】返回store中的最后一条数据。【原创内容,转载请注明出处】
本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【转载请注明来源】let lastRecord = await store.last()
some转载请注明出处:www.tangshuang.net
著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【转载请注明来源】返回几条连续的数据。【本文受版权保护】
【原创不易,请尊重版权】【转载请注明来源】未经授权,禁止复制转载。- count: 返回的数量转载请注明出处:www.tangshuang.net 原创内容,盗版必究。【原创不易,请尊重版权】【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】
- offset: 位移量,即从哪个索引开始【转载请注明来源】本文作者:唐霜,转载请注明出处。,默认为0 【作者:唐霜】【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。
let someRecords = await store.some(5, 3)
表示从索引值为3开始,返回连续的5条记录著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net。
未经授权,禁止复制转载。【本文受版权保护】本文作者:唐霜,转载请注明出处。【本文受版权保护】当offset小于0时,查询将会移到所有【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net记录的尾部,例如:
【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【本文首发于唐霜的博客】let someRecords = await store.some(3, -5)
则会从倒数第5个记录开始拿取,一共拿出3【关注微信公众号:wwwtangshuangnet】【本文受版权保护】个。
本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。all本文作者:唐霜,转载请注明出处。
著作权归作者所有,禁止商业用途转载。【作者:唐霜】著作权归作者所有,禁止商业用途转载。返回store中的所有数据,结果为数组。
原创内容,盗版必究。【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。【作者:唐霜】let allRecords = await store.all()
count未经授权,禁止复制转载。
本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【版权所有,侵权必究】【本文受版权保护】返回store中所有数据的条数,结果为数转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。字。
【版权所有】唐霜 www.tangshuang.net【转载请注明来源】【版权所有】唐霜 www.tangshuang.netlet count = await store.count()
keys著作权归作者所有,禁止商业用途转载。
原创内容,盗版必究。未经授权,禁止复制转载。原创内容,盗版必究。【原创内容,转载请注明出处】返回store中所有记录的主键值,结果为著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】一个数组。
【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netlet keys = await store.keys()
上述就是所有InDB提供的查询api,这【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】些api具有非常简洁易用的特征,而且很多未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。情况下,你并不需要复杂的api,用上面这【作者:唐霜】本文作者:唐霜,转载请注明出处。些api完全可以满足你的查询需求。
【作者:唐霜】【本文首发于唐霜的博客】【版权所有,侵权必究】转载请注明出处:www.tangshuang.netKey-Value API【本文首发于唐霜的博客】
【未经授权禁止转载】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。在InDB里面,有几个特殊的API,它们转载请注明出处:www.tangshuang.net【本文受版权保护】和原生的Storage api命名保持一【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】致。要使用这些api,你必须在创建sto【原创不易,请尊重版权】原创内容,盗版必究。re时,在store的参数中使用isKv转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】为true,这样做之后,keyPath配【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】置,autoIncrement配置都将失未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】效,但它可以把当前这个store转化为一【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】个支持Storage api的store【版权所有,侵权必究】【原创不易,请尊重版权】。
【作者:唐霜】【本文受版权保护】著作权归作者所有,禁止商业用途转载。const store = new InDB({
name: 'my-idb',
stores: [
{
name: 'my-store',
isKv: true,
},
],
use: 'my-store',
})
这样配置之后(注意,在你的代码第一次发布转载请注明出处:www.tangshuang.net【转载请注明来源】上线之前就必须这样做,而不能等到后面发布未经授权,禁止复制转载。【原创内容,转载请注明出处】新版本的时候再调整,否则你必须通过升级v【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。ersion值来办到),这个store就本文作者:唐霜,转载请注明出处。【未经授权禁止转载】可以调用如下api。
【原创不易,请尊重版权】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。getItem本文版权归作者所有,未经授权不得转载。
【未经授权禁止转载】【作者:唐霜】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【作者:唐霜】获取对应key的值。【作者:唐霜】
著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【本文首发于唐霜的博客】【原创内容,转载请注明出处】let value = await store.getItem(key)
setItem【作者:唐霜】
未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】设置对应key的值。转载请注明出处:www.tangshuang.net
【原创不易,请尊重版权】【原创内容,转载请注明出处】【作者:唐霜】await store.setItem(key, value)
removeItem未经授权,禁止复制转载。
原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】删除对应的key-value。【原创不易,请尊重版权】
未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】awiat store.removeItem(key)
以上就是Storage api,这使得使【原创不易,请尊重版权】【原创内容,转载请注明出处】用InDB之后,可以像使用localSt本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】orage一样操作indexedDB,非著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net常方便。
【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。遍历API【未经授权禁止转载】
本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【未经授权禁止转载】原创内容,盗版必究。这一些特殊情况下,你可能还需要更奇特的操【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】作,InDB提供了几个可能对你有帮助的a原创内容,盗版必究。【作者:唐霜】pi,利用它们,你可以办到任何你想干的事【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。。
【本文首发于唐霜的博客】【原创不易,请尊重版权】【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】each【本文首发于唐霜的博客】
【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net遍历当前store。【原创不易,请尊重版权】
【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【本文受版权保护】【本文首发于唐霜的博客】【原创内容,转载请注明出处】await store.each((obj) => {
// ..
})
通过each,可以遍历整个store,这【作者:唐霜】【转载请注明来源】样,如果当上面的api不能满足你的查询需【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。求的时候,你可以自己写一个遍历操作来搜集【关注微信公众号:wwwtangshuangnet】【作者:唐霜】所有满足你的条件的记录。
本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】each接收一个函数,函数可以有如下参数原创内容,盗版必究。【原创不易,请尊重版权】:
本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】- obj: 当前的记录未经授权,禁止复制转载。 【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net
reverse【原创内容,转载请注明出处】
【转载请注明来源】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】逆序遍历整个store。【本文受版权保护】
转载请注明出处:www.tangshuang.net【转载请注明来源】【作者:唐霜】【本文首发于唐霜的博客】和each用法一摸一样,只不过迭代的方向【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。是从store的最后一条往第一条。
未经授权,禁止复制转载。【本文受版权保护】【版权所有】唐霜 www.tangshuang.net原子API【原创内容,转载请注明出处】
本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【转载请注明来源】InDB提供了一套可以快速进入原生操作的本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。api,它可以帮助你不需要写太多原生代码【版权所有】唐霜 www.tangshuang.net【作者:唐霜】,就可以拿到indexedDB的原生对象转载请注明出处:www.tangshuang.net原创内容,盗版必究。,在这些原生对象的基础上进行下一步操作。
【原创不易,请尊重版权】【未经授权禁止转载】【本文首发于唐霜的博客】transaction【关注微信公众号:wwwtangshuangnet】
【本文受版权保护】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。基于当前store,快速开启一个事务,而本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net且不用担心事务的可用性。
【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】转载请注明出处:www.tangshuang.net- writable: 是否开启一个可写的事【版权所有】唐霜 www.tangshuang.net【作者:唐霜】务,默认是关闭的 本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】
let tx = await store.transaction(true)
objectStore【版权所有】唐霜 www.tangshuang.net
本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【作者:唐霜】未经授权,禁止复制转载。【本文受版权保护】快速打开当前store。本文作者:唐霜,转载请注明出处。
【转载请注明来源】【作者:唐霜】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。- writable: 是否在一个可写的事务本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net打开该store,默认是关闭的 【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】
let objectStore = await store.objectStore()
cursor【转载请注明来源】
转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】打开一个游标来遍历数据。【版权所有,侵权必究】
未经授权,禁止复制转载。未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】await store.cursor({
index:'indexName',
ranage:null, // [IDBKeyRange](https://developer.mozilla.org/en-US/docs/Web/API/IDBKeyRange)
direction:'next', // next or prev
writable:false, // true or false
onTouch, // function, (cursor, owner) => {}, `owner` is the owner of cursor (objectStore or index)
onDone, // function
onError, // function
})
iterate转载请注明出处:www.tangshuang.net
本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】await store.iterate((cursor, next, stop) => {
// ...
}, {
writable: false,
direction: 'next',
})
当调用stop的时候,直接resolve原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。当前这个promise。
转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net原创内容,盗版必究。request转载请注明出处:www.tangshuang.net
本文版权归作者所有,未经授权不得转载。【转载请注明来源】【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。基于当前store发起一个request【版权所有】唐霜 www.tangshuang.net【作者:唐霜】。
本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【版权所有,侵权必究】未经授权,禁止复制转载。这是一个非常强大,但理解起来比较复杂的a【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】pi,如果你不是很了解原生的indexe著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netdDB接口,可能使用起来就有些吃力。
【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。转载请注明出处:www.tangshuang.netawait store.request(fn, { writable })
- fn: 基于当前store发起reque本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。st的准备动作,是一个函数,函数必须返回【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。一个request实例 【原创内容,转载请注明出处】【转载请注明来源】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【本文受版权保护】
- options
本文作者:唐霜,转载请注明出处。
- writable: 是否以可写模式运行,本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。默认为只读,设置为true后这个requ【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netest是可写的 著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net
【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。
store.request(objectStore => objectStore.get(key)).then(obj => console.log(obj))
InDB内置的很多方法都是通过这种形式调【转载请注明来源】未经授权,禁止复制转载。用原生api实现的。
原创内容,盗版必究。未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】batch【本文首发于唐霜的博客】
【本文首发于唐霜的博客】【原创内容,转载请注明出处】原创内容,盗版必究。【原创内容,转载请注明出处】【未经授权禁止转载】发起一个批量任务。本文版权归作者所有,未经授权不得转载。
【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。store.batch([
objectStore => objectStore.put(obj1),
objectStore => objectStore.put(obj2),
objectStore => objectStore.remove(obj3),
], {
writable: true,
})
keyPath原创内容,盗版必究。
【本文受版权保护】【作者:唐霜】【原创不易,请尊重版权】【本文受版权保护】这是一个属性,快速获取当前store的主【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】键名。
转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】let keyPath = store.keyPath
数据库管理【作者:唐霜】
【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】前面的所有一切,都是只对当前的store【未经授权禁止转载】【原创内容,转载请注明出处】进行操作,如果你希望切换到另外一个sto转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。re进行操作怎么办呢?
【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。connect本文作者:唐霜,转载请注明出处。
本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【作者:唐霜】打开一个数据库连接。【原创内容,转载请注明出处】
原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】【原创不易,请尊重版权】const db = idb.connect()
use转载请注明出处:www.tangshuang.net
【关注微信公众号:wwwtangshuangnet】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】【本文受版权保护】基于当前的数据库配置,切换到一个stor【版权所有,侵权必究】未经授权,禁止复制转载。e。
【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。const store2 = idb.use('store2')
注意:use是一个同步方法,和其他大部分未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。方法不同,它不返回一个promise,而【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】是直接返回一个InDBStore实例。
著作权归作者所有,禁止商业用途转载。【作者:唐霜】本文版权归作者所有,未经授权不得转载。close【关注微信公众号:wwwtangshuangnet】
原创内容,盗版必究。【转载请注明来源】【本文首发于唐霜的博客】【原创不易,请尊重版权】【本文受版权保护】关闭当前数据库连接。几乎不会用到。【关注微信公众号:wwwtangshuangnet】
【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。version【本文受版权保护】
【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【作者:唐霜】由于indexedDB的特点是,你一旦创【本文首发于唐霜的博客】【本文首发于唐霜的博客】建数据库之后,不可以随意修改数据的任何结原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】构,因此,你不能通过修改代码来实现数据库著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】结构调整。如果哪一天,你真的需要调整数据【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】了怎么办?
【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】原创内容,盗版必究。你需要明白一个道理,indexedDB是【本文受版权保护】本文版权归作者所有,未经授权不得转载。在用户的浏览器的,你不可能像MySQL一原创内容,盗版必究。本文作者:唐霜,转载请注明出处。样自己去执行一些脚步一次性修改。怎么做呢【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】?就是在你新发布的代码中,增加versi【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.neton,并且修改options。
【转载请注明来源】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】前端项目的脚步很多都会放在CDN,在你下本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。一次进行发布时,你需要修改你的代码:
转载请注明出处:www.tangshuang.net【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.netexport const store = new InDB({
name: 'my-idb',
version: 2,
stores: [
{
name: 'my-store',
isKv: true,
},
{
name: 'my-store2',
keyPath: 'id',
},
],
use: 'my-store',
})
export const store2 = store.use('store2')
上面的代码表示,我在新版本中,新增了一个【转载请注明来源】转载请注明出处:www.tangshuang.netstore,并通过升级version来使【版权所有】唐霜 www.tangshuang.net【本文受版权保护】得这个修改生效。一次修改,必须基于前一个著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。版本进行,否则你会发现,你的数据库管理非著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。常混乱。
【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【转载请注明来源】未经授权,禁止复制转载。结语【本文受版权保护】
【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。我从去年开始不断深入学习indexedD【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.netB,甚至对google的leveldb都著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net进行了一定的了解,很多人都不知道,chr本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】ome里面的indexedDB有一个特点【作者:唐霜】未经授权,禁止复制转载。:读慢写快,如果不是深入了解,根本不会明著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】白为什么会出现这样的特点。在整个学习过程原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。中,我发现,对于开发者而言,了解这些深层未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。次的知识虽然是有必要的,但是却无法快速入著作权归作者所有,禁止商业用途转载。【转载请注明来源】门,上手使用,每天要写重复的reques本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.nett代码,会让人崩溃。一个真正好的开发工具【本文受版权保护】【转载请注明来源】,是帮助开发者抹平这些复杂的凹凸不平的底本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】层信息,只给开发者最直观好用的结果。这也【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net是我这两年来越来越注重的事。如果你觉得这【版权所有,侵权必究】未经授权,禁止复制转载。个项目还不错,请在我的github上点s未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。tar,让更多人了解它。
本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】 著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【版权所有,侵权必究】(完)未经授权,禁止复制转载。
【版权所有,侵权必究】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【未经授权禁止转载】
【本文受版权保护】【作者:唐霜】【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。如果你觉得本书对你有帮助,通过下方的二维码向我打赏吧,帮助我写出更多有用的内容。

2018-09-15
博主你好,请问如果有的浏览器不兼容indexDB,new InDB()会返回什么?
这个需要你提供具体的一个场景,indexedDB的兼容性可以通过caniuse.com查询
目前还没找到不兼容的场景,主要是我想知道InDB初始化失败会返回的内容是什么?我方便判断错误条件成立,做一下错误处理。
可以遇到问题再及时反馈
博主!事务那里怎么一笔带过?要怎么使用?
因为InDB已经封装好事务了,事务这部分非常难理解,所以InDB默认屏蔽这部分。要了解事务,可以看 https://www.tangshuang.net/3735.html#title-6
{
name: ‘Indb’,
version: 1,
stores: [
{
name: ‘Version’,
keyPath: ‘Version’,
isKv: true,
indexes: [
{
name: ‘dict_code’,
keyPath: ‘dict_code’,
unique: true
},
{
name: ‘dict_name’,
keyPath: ‘dict_name’,
unique: false
}
]
}
]
}
store.put(
{
dict_code: ‘devicecompareitem’,
dict_load_way: ‘0’,
dict_name: ‘设备对照’,
dict_version: 26,
id: ‘8ae4e6f45f57107a015f57c35dfc001e’,
}
)
为什么我这样put,老是报 【 Failed to execute ‘put’ on ‘IDBObjectStore’: Evaluating the object store’s key path did not yield a value.】
你keyPath定的Version,但你put的值没这个字段
另外,你isKv:true,代表你这个store是一个kv库,你只能用setItem
上面的问题解决了,又出现一个新的问题。我用get 无法获取值。结果始终是 undefined。store 设置了 keyPath,我也是用keyPath 的值去get,【主键值,注意,是值,不是名】。但是用 find 就没问题。请大佬给指点一二
不给case让我凭空想象,我也很为难啊……gitee 走一个?
async find (_dbName, _store, _indexName, _indexValue) {
return this.indbOpen(_dbName, _store).find(_indexName, _indexValue)
},
使用find 的时候 ,everything is well
要看就给个完整的代码看啊,你这种丢一段代码谁能看出来?
select多条件查询时查不到数据 明明有匹配的数据 但返回一直是空数组
var objs = await userStore.select([
{ key: ‘birthday_month’, value: 4, compare: ‘=’ },
{ key: ‘birthday_date’, value: 22, compare: ‘=’ },
])
已经修复了,升级到最新版本应该就可以了,感谢指出问题
请问一下支持批量添加?如何实现?
你可以给 put 传入一个数组,把要添加的多条记录一次性传入,比如:
“`
await put([
{ id: 1, value: ‘111’ },
{ id: 2, value: ‘222’ },
])
“`
支持批量添加?如何实现?
IE 浏览器试过吗,我这里试了IE不行
https://caniuse.com/?search=indexeddb
IE本身就不支持,放弃吧。
可以看我视频教程中的对比。
我使用了这个多条件select,但是怎么配合some取10条数据,做分页?
select一次性取出所有数据,暂不支持分页。如果你一定要分页,可以看下用iterate自己实现一个类似的方法。
那可以加条件,按新旧,数字大小来排序功能吗
indexedDb本身没有提供排序的能力,你提出的这些排序需求,最终还是落实到js排序,属于算法层面的东西,所以我也不会提供排序的功能。
关于indexedDB的所有功能,你可以阅读我文档开头提到的另外一篇文档,了解完整的indexedDB能力。
unique: true 我一个索引名称里的值用了不能重复值 ,然后再用put添加数据有重复的就出错,这个怎么解决。
some这个方法,可以实现查询某个索引区间,返回前10条,或10-20条的数据吗?
你具体阅读一下 offset 的解释
追问:
remove和delete有什么区别,好像都是通过主键删除行
remove 接收整个 object 也是调用 delete 去删
remove中主键是必传项,似乎和delete的功能重复,没有设置的意义
具体的使用场景不同,要用到的时候你自然会去用
拜读了教程,有些许不明白的地方
1、keyPath可以是链式的多级属性,这个不明白什么含义,能举个使用例子吗?
2、如何实现批量添加和删除多个行?
阅读一下教程里面关于keyPath的部分,简单说就是可以用 parent.child 这种形式做主键。
目前没有批量删。后期我把批量删除功能加上吧。