批量查询preparedstatement只需要最后关闭还是每次都关闭_IndexedDB查询和升级版本...

6757287de5a4a88d3251f684f1c7a179.png

关于IndexedDB的基本概念和用法本文就不再叙述了,网络上很多相关内容,推荐MDN的使用说明:https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API/Using_IndexedDB

本文主要讲一下查询升级版本的相关内容

查询

IndexedDB里,做查询其实很麻烦,它有如下特点:

  1. 不支持模糊查询
  2. 不支持分页
  3. 关键字查询需先创建索引,包括多条件

应用示例

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。字段在创建或更新数据时任意添加。

DBversion,它在打开DB时可以指定,如:

let request = indexedDB.open("dbName", dbVersion);

dbVersion是数字,如果不指定,默认为1,open方法一旦成功,DB则已创建。创建StoreIndex会在事件request.onupgradeneeded里进行。

onupgradeneeded事件会在两种情况下被触发:

  1. 创建DB后,即首先执行indexedDB.open()函数后
  2. 升级版本号后,即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});
    } else {
        objectStore.createIndex('newIndexName', 'newIndexPath', {unique: true});
    }
}

这里先判断了Store是否存在,如果在存在的情况下创建会抛出异常。

应用在多窗口被打开时升级版本

这个问题很明显,如果有多个窗口都运行着应用,当升级版本的代码更新后,重载其中一个窗口,那另一个窗口仍然是打开着旧的版本,显然不太正常。所以IndexedDB提供了一个事件(onblocked)用于确认其它窗口是否关闭或重载。因此:

request.onblocked = function(event) {
    alert('请关闭其它打开应用的窗口');
}

在其它窗口关闭后,onupgradeneeded事件才会被触发。

小结

IndexedDB很方便,但限制还是很多,如果应用关系比较复杂,它并不是一个理想的选择,有时候甚至还不如localStorage,但聊胜于无。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值