IndexedDB查询和升级版本
关于 IndexedDB 的基本概念和用法本文就不再叙述了,网络上很多相关内容,推荐 MDN 的使用说明: https:// developer.mozilla.org/z h-CN/docs/Web/API/IndexedDB_API/Using_IndexedDB
本文主要讲一下 查询 和 升级版本 的相关内容
查询
在 IndexedDB 里,做查询其实很麻烦,它有如下特点:
- 不支持模糊查询
- 不支持分页
- 关键字查询需先创建索引,包括多条件
应用示例
1. 查询指定分类下所有的数据并按创建时间排序
let objectStore = db.transaction('StoreName').objectStore('StoreName');
let request = objectStore.index(createTime).openCursor(category, 'next');
request.onsuccess = function(event) {};
首先,创建时间
createTime
是一个索引,因此使用
objectStore.index(createTime)
来指定它,之后
openCursor
的第二个参数
next
,将作用于它。
当所有数据使用的索引值都相同时,排序将会作用于主键。因此,想要满足指定分类同时以创建时间排序,这样显然是不行的。只能自己处理,如:
request.onsuccess = function(event) {
let cursor = event.target.result;
if (cursor) {
result.push(cursor.value);
cursor.continue();
} else {
result.sort(function(a, b) {
if (order == 'prev') {
return -(a.createTime - b.createTime);
} else {
return a.createTime - b.createTime;
其次,
openCursor
的第一个参数是游标范围,这里使用
category
,即指定范围为对应的分类。
最后,顺序有4个值:
next
,
nextunique
,
prev
,
prevunique
2. 模糊查询
因为
IndexedDB
并不支持模糊查询,所以,只能在结果中自行判断,可以简单的使用
indexOf
来进行,如:
request.onsuccess = function(event) {
let cursor = event.target.result;
if (cursor) {
if (searchKey && cursor.value.title.indexOf(searchKey) !== -1) {
result.push(cursor.value);
cursor.continue();
升级版本
IndexedDB 只有 DB , Store , Index 的概念,它的存储本身是key value形式,没有字段的概念,所以就没有更新字段的情况,只需要操作Store和Index。字段在创建或更新数据时任意添加。
DB 有 version ,它在打开DB时可以指定,如:
let request = indexedDB.open("dbName", dbVersion);
dbVersion
是数字,如果不指定,默认为1,
open
方法一旦成功,DB则已创建。创建
Store
和
Index
会在事件
request.onupgradeneeded
里进行。
onupgradeneeded
事件会在两种情况下被触发:
-
创建DB后,即首先执行
indexedDB.open()
函数后 - 升级版本号后,即 dbVersion 增加
所以,只要需要增加
Store
或调整
Index
时,我们就可以增加版本号来触发
onupgradeneeded
事件的执行,然后在其里面操作Store和Index。如:
request.onupgradeneeded = function(event) {
db = event.target.result;
if (!db.objectStoreNames.contains('StoreName')) {
let objectStore = db.createObjectStore('StoreName', {autoIncrement: true});
objectStore.createIndex('indexName', 'indexPath', {unique: true});