使用Dexie优雅使用indexedDB

446 阅读2分钟

dexie.org/

dexie是一个专门针对IndexedDB而封装的工具类

安装语句为

**npm install dexie

// html js
<https://unpkg.com/dexie@latest/dist/dexie.js**>

相对于原生,他的优点是什么

  • 支持Promise
  • 接口保持与原生一致
  • 支持批量操作
  • 扩展接口
  • 支持更好更方便的过滤方法,支持链式调用
  • 版本更新自动修改表结构

支持更丰富索引类型

常见符号

符号描述
++自动递增主键
&唯一主键
*多值索引
+复合索引
  • 主键:如果不指定指引,那么在建表语句第一个字段就会默认为索引,如果添加++,那么这个主键是自增的
  • 唯一索引(&):该字段的值在唯一的,不可重复。当使用add方法的值和唯一索引相同时,不可加入。
  • 多值索引(*):该字段具有多个值,最常见为array,并且可以通过其中一个值来搜索
  • 复合索引(+):该字段由多个字段组成格式为[A+B]
建表语句
db.version(1).stores({
	demo: '++id, '
})

常用的查询方法

所有where 子句运算符都可用于查询多条目索引对象,

  • above() 返回指定字段的值大于某个值的所有记录
  • aboveOrEqual() 返回指定字段值大于等于某个值的所有记录
  • anyOf() 返回数据集中包含在给定数组中的记录
  • below() 返回指定字段的值小于某个值的所有记录
  • belowOrEqual() 返回指定字段值小于等于某个值的所有记录
  • between() 返回介于两者之间的记录
  • equals() 等于

dexie最主要的就是方便的查询,而查询主要依赖于主键和索引。所以上面这一堆是我认为日常业务中最多会使用到的业务场景。如果有其他问题也可以使用参考下面链接,里面有更加详细的API说明

import Dexie from 'dexie'

const APP_DATABASE_NAME = 'dexie_database'
const APP_DATABASE_VERSION = 1
export class DexieTools {
    private db!: Dexie;
    private demoIndex!: Dexie.Table

    constructor() {
        this.open()
    }
    
    private open() {
        this.db = new Dexie(APP_DATABASE_NAME)
        // 指定版本并创建表
        this.db.version(APP_DATABASE_VERSION)
        .stores({
            teachers: '++id, name',
            students: 'id, &name',
            demoIndex: '++id, &name, age, [name+age], *names'
        })
        this.demoIndex = this.db.demoIndex
    }

    async test_add() {
        console.log(this.db, 'db')

        this.db.demoIndex.add({
            name: 'demo4',
            age: 2,
            names: ['1','2']
        })
        this.db.demoIndex.add({
            name: 'demo5',
            age: 2,
            names: ['3','4']
        })
        // this.db.teachers.add({
        //     name: 't1'
        // })
        // this.db.students.add({
        //     id: 1, name: 's1'
        // })
        console.log(await this.db.teachers.get(1))
    }
    async test_read() {
        const db = this.db
        console.log(this.demoIndex)
        // 多值索引查询
        console.log(await this.demoIndex.where('names').equals('3').toArray())
        // 普通索引查询
        console.log(await this.demoIndex.where('age').equals(2).toArray())
        // 复合索引
        console.log(await this.demoIndex.where({
            name: 'demo5',
            age: 2
        }).first(), '<----- 3')
    }
}

参考链接

blog.csdn.net/hjb2722404/…