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')
}
}
参考链接