使用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工具类封装 >>>>>>>>>>>>>>>>>> ... 
随机推荐
- 字节跳动笔试题:1. 小于N的质数数量;2. 逆时针二维数组;3. 判断a+b>c
			1. 小于N的质数数量 import java.util.Scanner; /** * 计算小于N的质数数量 * @author Turing * */ public class Main4 { pu ... 
- 现代WEB前端的性能优化
			现代WEB前端的性能优化 前言:这只是一份学习笔记. 什么是WEB前端 潜在的优化点: DNS是否可以通过缓存减少DNS查询时间? 网络请求的过程走最近的网络环境? 相同的静态资源是否可以缓存? 能否 ... 
- 奥展项目笔记05--域名、端口、Nginx相关知识笔记
			1.我国的电信运营商是默认封闭80端口的. 中国电信屏蔽ADSL用户80端口 只是做应用服务器的话你可以使用别的端口. 80端口电脑上同时有各种各样的程序在运行,他们都需要借助网络来进行通信.例如,你 ... 
- 博客中新浪图床 迁移至 阿里云的OSS
			前言 因为之前有个新浪的图床,还挺好用,而且免费,自己博客的图片上传到其上面也挺方便的,但是,前几周吧,突然图片就不能访问了,之前本来是想通过添加 meta 头来解决的,但是发现没有效果.于是就自己搞 ... 
- gitLab 分支保护设置
			一.需求背景 开发当前开发的分支遇到暂时无法解决的问题,现在有需要开发其他应用,所以希望运维这边将当前有问题分支冻结,让其他人无法进行修改,待后续有时间在排查代码问题 二.Gitlab配置步骤 1.搜 ... 
- ASP.NET web.config 配置里部分参数详细说明
			Session配置 <!-- <identity impersonate = "false" [true|false] userName = "" ... 
- 【05】Nginx:TCP / 正向 / 反向代理 / 负载均衡
			写在前面的话 在我们日常的工作中,不可能所有的服务都是简单的 HTML 静态网页,nginx 作为轻量级的 WEB 服务器,其实我们将它用于更多的地方还是作为我们网站的入口.不管你是后端接口,还是前端 ... 
- python3之二年级上数学练习题生成
			二年级上数学练习题生成 作为一个家长不容易啊 1 #coding:utf-8 2 import random 3 #小学二年级上数学练习(100以内加减乘) 4 #生成的题数 5 count = 50 ... 
- 关于css中布局遇到的一些问题
			现在本人初学网页布局经常遇到一些布局问题比如图片错位. 遇到的问题以及解决方案如下 行内元素有缝隙 块级元素没有缝隙 行内块元素中间会有小缝隙 常见的解决办法就是浮动 
- 用实力燃爆暑期丨i春秋渗透测试工程师线下就业班开课了!
			i春秋&赛虎暑期渗透测试工程师线下就业班开课了! 本期开班地点:北京,面授脱产:四个月. 如果这次没来得及报名的同学也可以选择9月份广州的班次,具体开班时间请咨询谢老师:18513200565 ... 
