封装如下:

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 操作类,并实现模糊搜索的更多相关文章

  1. 封装一个redis操作类来操作hash格式

    最近项目要用redis,依然是基于tp3.2. 发现thinkphp3.2自带的缓存类并不好使用,就自己封装了一个 目前只支持hash格式,其他数据类型的操作后面用到的时候再补充 <?php / ...

  2. php 封装mysql 数据库操作类

    <?phpheader('content-type:text/html;charset=utf-8');//封装mysql   连接数据库php_mysql//封装mysql   连接数据库ph ...

  3. php 封装Mysql数据库操作类

    花了点时间写了个基于php5.3的Mysql类 $mysql = new Mysql('host','user','pass','db') bool Mysql::insert("表&quo ...

  4. php封装的sqlite操作类

    sqlite在php中是默认安装的本地小型化数据库,类似于xml的小型数据库,但sqlite功能更强. sqlite.class.php文件: <?php class sqliteDB{ pri ...

  5. 我的DbHelper数据操作类

    其实,微软的企业库中有一个非常不错的数据操作类了.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过微软的企业库框架了...但是还是要&q ...

  6. DbHelper数据操作类

    摘要:本文介绍一下DbHelper数据操作类 微软的企业库中有一个非常不错的数据操作类.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过 ...

  7. 我的DbHelper数据操作类(转)

    其实,微软的企业库中有一个非常不错的数据操作类了.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过微软的企业库框架了...但是还是要&q ...

  8. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  9. Redis操作Hash工具类封装,Redis工具类封装

    Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...

随机推荐

  1. jboss_log4j.xml配置

    log4j是个优秀的开源的java日志系统,jboss内部也集成他,在jboss下默认的只是对server做了每日日志,并没有对你部署的项目进行每日的日志构建,但我们能通过修改jboss-log4j. ...

  2. 小小见解之python循环依赖

    a.py from b import b print '---------this is module a.py----------' def a(): print "hello, a&qu ...

  3. mysql派生查询必须有别名问题记录

    最近在做mysql sql兼容,原来是oracle的sql都要保证在mysql数据库运行 业务场景:原来是一个带有子查询的sql,在oracle是可以正常运行的,迁到mysql就发现报错了,报错信息如 ...

  4. Python 小案例实战 —— 简易银行存取款查询系统

    Python 小案例实战 -- 简易银行存取款查询系统 涉及知识点 包的调用 字典.列表的混合运用 列表元素索引.追加 基本的循环与分支结构 源码 import sys import time ban ...

  5. java构建树形列表(带children属性)

    一些前端框架提供的树形表格需要手动构建树形列表(带children属性的对象数组),这种结构一般是需要在Java后台构建好. 构建的方式是通过id字段与父id字段做关联,通过递归构建children字 ...

  6. 图书推荐《图解HTTP》

    作品简介 本书对互联网基盘——HTTP协议进行了全面系统的介绍.作者由HTTP协议的发展历史娓娓道来,严谨细致地剖析了HTTP协议的结构,列举诸多常见通信场景及实战案例,最后延伸到Web安全.最新技术 ...

  7. Java中级—转发和重定向的区别

    在设计Web应用程序的时候,经常需要把一个系统进行结构化设计,即按照模块进行划分,让不同的Servlet来实现不同的功能,例如可以让其中一个Servlet接收用户的请求,另外一个Servlet来处理用 ...

  8. 关于创建node服务

    1.环境条件准备: A.确定node已经创建 B.npm或cnpm已经下载,npm和cnpm其实是一个道理 C.mysql或者使用其他数据库已经安装(本例使用mysql) 2.开始创建,首先新建一个文 ...

  9. 浅谈cookie 和 session

    一. cookie 定义:保存在浏览器本地上的一组组键值对 特点: 由服务器让浏览器进行设置的 浏览器保存在浏览器本地 下次访问时自动携带 应用: 登录 保存浏览习惯 简单的投票 使用cookie的原 ...

  10. 【AI测试】也许这有你想知道的人工智能 (AI) 测试--开篇

    人工智能测试 什么是人工智能,人工智能是怎么测试的.可能是大家一开始最想了解的. 大家看图中关于人工智能的定义.通俗点来说呢,就是 让机器实现原来只有人类才能完成的任务:比如看懂照片,听懂说话,思考等 ...