使用ES6 Class封装的IndexDB 操作类,并实现模糊搜索
封装如下:
indexDBOperate.js
export class IndexDBOperate {
db = null // 数据库实例
databaseName = null // 数据库名称
version = null // 数据库版本
objStoName = null // 表或对象仓库名称
constructor(databaseName, version, objStoName, indexObj, successFunc) {
this.databaseName = databaseName
this.version = version
this.objStoName = objStoName
// 若无此数据库则会创建
const request = window.indexedDB.open(databaseName, version)
request.onerror = e => {
console.log('数据库打开报错')
}
request.onsuccess = e => {
this.db = request.result
const db = request.result
console.log('数据库打开成功')
// 建表或对象仓库,id作为主键
successFunc(db)
}
// 如果指定的版本号,大于数据库的实际版本号,就会发生数据库升级事件
// 第一次打开数据库时,会先触发upgradeneeded事件,然后触发success事件
request.onupgradeneeded = e => {
// console.log('数据库打开/创建报错')
// this.db = e.target.result
const db = e.target.result
if (!db.objectStoreNames.contains(objStoName)) {
// 建表
const objectStore = db.createObjectStore(objStoName, { keyPath: 'id' });
// 新建索引(索引名称、索引所在的属性、配置对象(说明该属性是否包含重复的值))
objectStore.createIndex(indexObj.indexName, indexObj.IndexAattrOf, indexObj.config)
}
}
request.blocked = e => {
// console.log('上一次的数据库连接还未关闭')
}
}
// 创建
createData = data => {
const request = this.db.transaction([`${this.objStoName}`], 'readwrite')
.objectStore(`${this.objStoName}`)
.add(data)
request.onsuccess = e => {
console.log('数据写入成功')
}
request.onerror = e => {
console.log('数据写入失败', e.target.error)
}
}
// 更新
updateData = data => {
const request = this.db.transaction([`${this.objStoName}`], 'readwrite').objectStore(`${this.objStoName}`)
.put(data)
request.onsuccess = e => {
// console.log('数据更新成功')
};
request.onerror = e => {
// console.log('数据更新失败')
}
}
// 读
retrieveData = (id, successFunc) => {
const transaction = this.db.transaction([`${this.objStoName}`])
const objectStore = transaction.objectStore(`${this.objStoName}`)
const request = objectStore.get(id)
request.onerror = e => {
// console.log('事务失败')
};
request.onsuccess = e => {
if (request.result) {
successFunc(request.result)
// console.log('Name: ' + request.result.name)
// console.log('Age: ' + request.result.age)
// console.log('Email: ' + request.result.email)
} else {
// console.log('未获得数据记录')
}
};
}
// 遍历
readAllData = successFunc => {
const objectStore = this.db.transaction([`${this.objStoName}`], 'readwrite')
.objectStore(`${this.objStoName}`)
objectStore.openCursor().onsuccess = e => {
const cursor = e.target.result
if (cursor) {
successFunc(cursor)
cursor.continue()
// console.log('Id: ' + cursor.key)
// console.log('Name: ' + cursor.value.name)
// console.log('Age: ' + cursor.value.age)
// console.log('Email: ' + cursor.value.email)
} else {
// console.log('没有更多数据了!')
}
};
}
// 遍历(加入模糊搜索)
fuzzySearchData = (field, keyWord, successFunc) => {
const objectStore = this.db.transaction([`${this.objStoName}`], 'readwrite')
.objectStore(`${this.objStoName}`)
const data = []
objectStore.openCursor().onsuccess = e => {
const cursor = e.target.result
if (cursor) {
if (cursor.value[`${field}`].indexOf(keyWord) >= 0) {
data.push(cursor.value)
}
cursor.continue()
// console.log('Id: ' + cursor.key)
// console.log('Name: ' + cursor.value.name)
// console.log('Age: ' + cursor.value.age)
// console.log('Email: ' + cursor.value.email)
} else {
// console.log('没有更多数据了!')
successFunc(data)
}
};
}
deleteData = id => {
const request = this.db.transaction([`${this.objStoName}`], 'readwrite')
.objectStore(`${this.objStoName}`)
.delete(id)
request.onsuccess = e => {
// console.log('数据删除成功')
};
}
// 通过索引获取数据
retrieveByIndex = (indexName, searchTerm, successFunc) => {
const transaction = this.db.transaction([`${this.objStoName}`], 'readonly')
const store = transaction.objectStore(`${this.objStoName}`)
const index = store.index(`${indexName}`)
const request = index.get(`${searchTerm}`)
request.onsuccess = e => {
const { result } = e.target
console.log(e.target)
if (result) {
// ...
successFunc(result)
} else {
// ...
}
}
}
}// 封装by 有蚊子 @2019.11.20
使用示例:
// indexDB调用示例
handleDB = () => {
const indexDB = new IndexDBOperate('chat_help_db', 1, 'chat_help', {
indexName: 'name',
IndexAattrOf: 'name',
config: {
unique: false,
},
}, db => { indexDB.fuzzySearchData('name', 'a', result => {
console.log(result)
})
indexDB.createData({ id: 7, name: 'aaa' })
indexDB.updateData({ id: 3, name: 'a2' })
indexDB.retrieveByIndex('name', 'a', result => {
console.log(result)
})
indexDB.deleteData(7)
indexDB.retrieveData(1, result => {
console.log(result)
})
indexDB.readAllData(result => {
console.log(result)
})
})
}
参考资料:
1. http://www.ruanyifeng.com/blog/2018/07/indexeddb.html 阮一峰indexdb使用
2.https://wangdoc.com/javascript/bom/indexeddb.html#idbindex-%E5%AF%B9%E8%B1%A1 indexdb api文档
使用ES6 Class封装的IndexDB 操作类,并实现模糊搜索的更多相关文章
- 封装一个redis操作类来操作hash格式
最近项目要用redis,依然是基于tp3.2. 发现thinkphp3.2自带的缓存类并不好使用,就自己封装了一个 目前只支持hash格式,其他数据类型的操作后面用到的时候再补充 <?php / ...
- php 封装mysql 数据库操作类
<?phpheader('content-type:text/html;charset=utf-8');//封装mysql 连接数据库php_mysql//封装mysql 连接数据库ph ...
- php 封装Mysql数据库操作类
花了点时间写了个基于php5.3的Mysql类 $mysql = new Mysql('host','user','pass','db') bool Mysql::insert("表&quo ...
- php封装的sqlite操作类
sqlite在php中是默认安装的本地小型化数据库,类似于xml的小型数据库,但sqlite功能更强. sqlite.class.php文件: <?php class sqliteDB{ pri ...
- 我的DbHelper数据操作类
其实,微软的企业库中有一个非常不错的数据操作类了.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过微软的企业库框架了...但是还是要&q ...
- DbHelper数据操作类
摘要:本文介绍一下DbHelper数据操作类 微软的企业库中有一个非常不错的数据操作类.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过 ...
- 我的DbHelper数据操作类(转)
其实,微软的企业库中有一个非常不错的数据操作类了.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过微软的企业库框架了...但是还是要&q ...
- 自己封装的poi操作Excel工具类
自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...
- Redis操作Hash工具类封装,Redis工具类封装
Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...
随机推荐
- UOJ Easy Round #5
Preface 本着刷遍(只刷一遍)各大OJ的原则我找到了一场UOJ的比赛 无奈UOJ一般的比赛难度太大,我就精选了UER中最简单的一场打了一下,就当是CSP前的练习吧 A. [UER #5]万圣节的 ...
- Windows安装RabbitMQ并设置数据存储目录
一.安装Elang 下载otp_win64_xx.x.exe,当前使用otp_win64_21.3.exe版本,按步骤完成安装. 下载地址:http://www.erlang.org/download ...
- Java Metrics工具介绍
目录 简介 快速入门 Maven配置 MetricRegistry Gauge Meter Counter Histgram Timer Reporter 更多用法 参考资料 简介 Metric是一个 ...
- 【转】pywinauto教程
一.环境安装 1.命令行安装方法 pip install pywinauto==0.6.7 2.手动安装方法 安装包下载链接:pyWin32: python调用windows api的库https:/ ...
- win7 64bit安装redis
win7 64bit安装redis 1 先安装redis客户端 1.下载Redis的压缩包 https://github.com/dmajkic/redis/downloads 我下载的是redis- ...
- HTML+CSS基础 border css属性 Div块 盒子
border css属性 边框颜色 border-color:red/#ffffff/rgb()默认为黑色 边框样式 border-style:solid (实线) dashed (虚线).默认为n ...
- fastadmin表单提交后却没有关闭弹窗
点击操作按钮弹出窗口,操作完之后提交表单,无论操作成功还是失败,窗口都不关闭,操作之后出现一个笑脸,3秒后回到弹框刚打开的样子 而我们想要的是这个效果: 在jS那里给这个按钮绑定一个事件即可实现
- Spring Boot整合Mybatis配置详解
首先,你得有个Spring Boot项目. 平时开发常用的repository包在mybatis里被替换成了mapper. 配置: 1.引入依赖: <dependency> <gro ...
- .net core EF Core 视图的应用
由之前的一篇文章<.net core Entity Framework 与 EF Core>我们都已经知道 EF Core 增加了许多特性,并且性能上也有了很大的提升. 但是EF Core ...
- Quartz的配置与使用
什么是Quartz Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为 ...