添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首发于 ColorGamer
IndexedDB查询和升级版本

IndexedDB查询和升级版本

关于 IndexedDB 的基本概念和用法本文就不再叙述了,网络上很多相关内容,推荐 MDN 的使用说明: developer.mozilla.org/z

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

查询

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

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

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

dbVersion 是数字,如果不指定,默认为1, open 方法一旦成功,DB则已创建。创建 Store Index 会在事件 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});