keyPath
1 .规定了把object哪个属性作为检索的入口
2 .objectStore.get(1)方法,就是通过传入索引的值来查找数据 此时要找id=1的数据
3 .这里的keyPath是创建的时候传入的值
indexName
1 .其实就是索引的名字,在创建objectStore的时候,为了以后查找方便,还要创建别的索引表。
2 .这张表里面就是以传入名字作为主键的一张关联表。也就是这样表的kayPath是你定义的索引
3 .注意,高级的用法是一个indexName对应多个keyPath
primaryKey
1 .一个索引在储存时,一定会把对应的primaryKey存进来,其实就是这个Objectstore的keyPath值,这个是索引的keyPath,设计上indexDB给索引加上了一个PrimaryKey,这样可以快速定位对象的具体位置
key
1 .这里的key指的是值,而非键。objectStore.get()传入的并非是一个属性的名字,而是属性的值
2 .
indexedDB事物的生命周期
1 .一个事务,会在他的声明周期里面规定的操作全部执行,一旦执行完毕,周期结束之后,那么事务就关闭了。不能利用这个事物进行下一部操作
2 .也就是说,不能在全局的某个地方创建一个事务,然后用一个变量保存起来,然后再后续操作中使用
3 .在indexDB中,事务会在非常短的时间内循环检查自己,当发现自己内部已经没有任务任务要做的时候,就会将自己关闭。
4 .
put和add区别
1 .如果obejctStore中已经有了这个id,那么表示更新这个object,如果没有,则添加这个object
2 .当设置了autoIncrement为true的时候,也就是主键自增的时候,put方法必须转入第二个参数。这第二个参数是主键的值,以此来确定你要更新的是哪一个主键对应的obejct.如果不传的话,可能会直接增加一个object到数据库中。所以最好还是不要使用自增字段,而是确保自己在传入的时候保证object中存在主键值
3 .推荐的做法:不设置autoIncrement,无论是添加还是修改object,都使用put。只要开发者注意传入object的时候一定要有一个主键即可
游标
1 .游标是一种机制,你无法打印游标,但是可以通过游标得到你当前操作的元素。同时,游标也就意味着有类似于next的方法,可以用来移动下一个位置
2 .对已知的集合对象进行遍历,在onsuccess中使用continue进行控制
3 .用来改进下一个相同的索引值可能会有很多返回情况的给做了改进
4 .
createObject
1 .autoIncrement:主键是否自增,如果为true,那么你在添加一个object的时候,可以不用传id,id会自动加1,但是这样的话,你就不知道这个object的id到底是多少,所以默认为false。但是你查的时候也不一定非要用这个查吧
2 .keyPath:主键,你将要存入object的一个property name
deleteObjectStore
1 .删除的时候,他的所有index也被删除了
常用api
https://www.tangshuang.net/3735.html#title-1
https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
IDBCursor对象
1 .代表指针对象,用来遍历数据仓库IDBObjectStore或者IDBIndex索引的记录
2 .属性
1 .source:返回正在遍历的对象仓库或者索引
2 .direction:字符串,表示指针遍历的方向。该属性可以通过openCursor()方法的第二个参数指定,一旦指定就不能改变了
3 .key:返回当前记录的主键
4 .value:返回当前记录的数据值
5 .primaryKey:对于数据仓库来说,返回的是key,对于索引来说,返回的是数据记录的主键
IDBKeyRange对象
1 .代表数据仓库里面的一组主键,根据这组主键,可以获取数据仓库或索引里面的一组记录
2 .指定上限
let x=IDBKeyRange.upperBound(x)
<=x
let x=IDBKeyRange.upperBound(x,true)
<x
3 .指定下限
let x=IDBKeyRange.lowerBound(y)
>=x
let x=IDBKeyRange.lowerBound(y,true)
>x
4 .同时指定上下限
let x=IDBKeyRange.bound(x,y)
let x=IDBKeyRange.bound(x,y,true,false)
//(false,false),(false,true),(true,true)
5 .获取一个值
let x=IDBKeyRange.only(x)
=x
6 .实例对象生成之后,将他作为参数输入IDBObjectStore或者IDBIndex对象的openCursor()方法,就可以在所设定的范围内读取数据
7 .实例组件有一个includes()方法来判断一个值是否在当前主键组内。
8 .但是这个适合比较一些数字吧,比如年龄之类的进行筛选,别的还是不行吧
9 .