indexDB

索引数据库,操作简便(目前主流浏览器正努力实现对index DB的支持),最主要的是我们可以很轻松的通过JS极其方便的对其调用;

现今多数业务需要离线访问、或将大量数据储存在客户端,减少从服务器获取数据,直接从本地获取数据。

目前做的业务中需要将图片及其他数据存储在本地、在有网时将其发送给服务器;考虑到手机图片过大、localStorage存储大小限制为5M、所以对indexDB做一封装、以便往后不再需要研究其中api、直接copy文件、调用其中方法;;

本以为会有能说清楚的博客、发现大家都在自己的业务层面苦苦挣扎、代码也是不清不楚、乱如麻,自己将代码整理了一番。

以下源码已封装、发到npm仓库,直接下载promise-indexeddb npm 包;

npm install promise-indexeddb --save

引用

拷贝promise-indexeddb包下的index.js 到自己的项目目录中、更换为自己想改的名称;

import * as IndexedDB from '@/utils/indexedDB';

创建数据库

IndexedDB.init({// 数据库名称dbName: 'hantMobile',// 数据表 数组 如果要创建多个表,则写多个即可tableList: [{// 表名tableName: 'patrolTable',// 主键keyPath: 'name',// 对应表的其他属性// attr:{//    autoIncrement:true, //是否自增// },// indexName: 'index',// 索引 不建议使用 因为使用索引 当前表必须有数据否则直接报错// unique:false // 对应索引是否唯一},],
})

执行以上操作之后可以查看浏览器已为我们创建了对应的数据库和表

添加数据

await IndexedDB.add({// 加到那个表里tableName: 'patrolTable',// data是要添加的数据data: {// 伪代码// 对应的主键与值 此处主键为name 主键值为file.namename: file.name,//  数据baseData: result,},
})

此时有同学发现对应的表下还是没有数据、indexedDB和localStorage不一样,不会实时刷新的、需要点到indexedDB上右键点击 refresh


然后会看到数据已经存在

读取所有数据

const result = await IndexedDB.readAll('patrolTable');
console.log('result--->',result);

根据主键查询对应数据

const dbRes = await IndexedDB.readByMainKey({// 表名tableName: 'patrolTable',// 主键值key: '1',
})

根据索引查询对应数据

const dbRes = await IndexedDB.readByIndex({// 表名tableName: 'patrolTable',// 索引名indexName: 'name',// 索引值indexVal: '文杰'
})

更新数据

IndexedDB.update({// 表名tableName: patrolListTable.name,// 对应的主键与值 和 数据 此处主键为userId 主键值为iddata: {userId: '1',patrolList: [{ name: '文杰' }],},
})

根据主键删除数据

IndexedDB.remove({tableName: 'patrolTable',key: '1',
})

删除数据库

IndexedDB.deleteDB('hantMobile')

关闭数据库

IndexedDB.deleteDB('hantMobile')

清除表

IndexedDB.deleteDB('patrolTable')

以下为封装的indexDB代码

let db;
let openRequest;
const indexedDB =window.indexedDB ||window.webkitIndexedDb ||window.mozIndexed ||window.msIndexedDB;// transaction 事务处理 意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。// tableList [{tableName,keyPath,indexName}]
/*** 初始化数据库* @param {string} dbName 数据库名* @param {Array} tableList 数据表列表*/// 初始化
export function init({ dbName, tableList }) {// 存在就打开 不存在新建 第二个参数为db 版本openRequest = indexedDB.open(dbName);// 新的数据库创建 或者数据库的版本号被更改会被触发openRequest.onupgradeneeded = function (e) {// 表的创建在这个回调里执行const thisDb = e.target.result;console.log('running onupgradeneeded' + thisDb);if (tableList?.length) {tableList.forEach((table) => {if (!thisDb.objectStoreNames.contains(table.tableName)) {console.log('I need to create the objectStore');// keyPath 主键 autoIncrement 是否自增const objectStore = thisDb.createObjectStore(table.tableName, {keyPath: table.keyPath,...table.attr,// autoIncrement: true,});if (table.indexName) {// 创建表的时候 可以去指定那些字段是可以被索引的字段objectStore.createIndex(table.indexName, table.indexName, {unique: table.unique || false,});}}});} else {console.error('请传入数据表参数');}};// 已经创建好的数据库创建成功的时候openRequest.onsuccess = function (e) {db = e.target.result;db.onerror = function (event) {console.error('Database error: ' + event.target.errorCode);console.dir(event.target);};};// 打开失败时调用openRequest.onerror = function (e) {console.error('openRequest.onerror', e);};
}/*** 添加一行* @param {string} tableName 表名* @param {object} data 数据* @returns {promise}*/
export function add({ tableName, data }) {return new Promise((suc, fail) => {const request = db.transaction([tableName], 'readwrite').objectStore(tableName).add(data);request.onsuccess = function (event) {suc();console.log('数据写入成功', event);};request.onerror = function (event) {fail();console.log('数据写入失败', event);};});
}/*** 遍历所有数据 其实这里有点坑 真正readAll是下面readAllPC这个方法,因为低版本webview手机不兼容objectStore.getAll所以使用游标来实现* @param {string} tableName 表名* @returns {promise}*/
export function readAll(tableName) {return new Promise((suc, fail) => {const objectStore = db.transaction([tableName], 'readwrite').objectStore(tableName);// 我这里做的是把所有的结果全部收集起来 当然我们可以做其他事情此处拿到的value是每条数据的结果、还有primaryKey主键、key、与directionconst result = [];objectStore.openCursor().onsuccess = function (event) {const cursor = event.target.result;if (cursor) {result.push({ ...cursor.value });cursor.continue();} else {suc(result);console.log('readAll成功==>' + result);}};objectStore.openCursor().onerror = function (event) {console.dir(event);fail();};});
}/*** 读取所有数据 仅在pc上或者版本高的手机浏览器中使用 readAllPC这个方法 这个在低版本weview的手机浏览器里面不兼容* @param {string} tableName* @returns {promise}*/
export function readAllForHighVersion(tableName) {return new Promise((suc, fail) => {const objectStore = db.transaction([tableName], 'readwrite').objectStore(tableName);const request = objectStore.getAll();request.onerror = function (event) {fail();console.log('readAll--->读取表事务失败', event);};request.onsuccess = function () {suc(request.result || []);};});
}/*** 根据主键查询对应数据* @param {string} tableName 表名* @param {string} key 主键* @returns {promise}*/
export function readByMainKey({ tableName, key }) {return new Promise((suc, fail) => {if (!key) {fail();return;}const objectStore = db.transaction([tableName], 'readwrite').objectStore(tableName);const request = objectStore.get(key);request.onerror = function (event) {console.error('根据主键查询对应数据', event);fail();};request.onsuccess = function () {suc(request.result || {});};});
}/*** 根据主键删除对应数据* @param {string} tableName 表名* @param {string} key 主键* @returns {promise}*/
export function remove({ tableName, key }) {return new Promise((suc, fail) => {const objectStore = db.transaction([tableName], 'readwrite').objectStore(tableName);const request = objectStore.delete(key);request.onerror = function (event) {console.error('更新失败', event);fail();};request.onsuccess = function (event) {console.log('删除成功', event);suc();};});
}/*** 根据主键更新对应数据* @param {object} data 对应的主键与值 和 数据* @param {string} tableName 表名* @returns {promise}*/
export function update({ tableName, data }) {return new Promise((suc, fail) => {const objectStore = db.transaction([tableName], 'readwrite').objectStore(tableName);const request = objectStore.put(data);request.onerror = function (event) {console.error('更新失败', event);fail();};request.onsuccess = function (event) {console.log('更新成功', event);suc();};});
}/*** 通过索引查找对应数据* @param {string} indexName 索引名称* @param {any} indexVal index 索引值* @param {string} tableName 表名* @returns {promise}*/
export function readByIndex({ tableName, indexName, indexVal }) {return new Promise((suc, fail) => {const objectStore = db.transaction([tableName], 'readwrite').objectStore(tableName);// 假定新建表格的时候,对name字段建立了索引。// objectStore.createIndex('name', 'name', { unique: false });const index = objectStore.index(indexName);const request = index.get(indexVal);request.onerror = function (event) {console.log('事务失败', event);fail();};request.onsuccess = function (event) {if (request.result) {suc(request.result);} else {console.log('未获得数据记录', event);}};});
}/*** 删除数据库* @param {string} DB_NAME 数据库名称* @returns */
export async function deleteDB(DB_NAME) {return indexedDB.deleteDatabase(DB_NAME);
}
/*** 关闭数据库* @param {string} DB_NAME 数据库名称* @returns */
export function closeDB(DB_NAME) {return indexedDB.close(DB_NAME);
}
/*** 清除表* @param {string} tableName* @returns {promise}*/
export function clearTable(tableName) {return new Promise((suc, fail) => {const objectStore = db.transaction([tableName], 'readwrite').objectStore(tableName);const request = objectStore.clear();request.onerror = function (event) {console.log('事务失败', event);fail();};request.onsuccess = function (event) {console.log('清除成功', event);suc();};});
}

HTML5 本地存储之IndexedDB封装及最详细教程相关推荐

  1. HTML5本地存储——IndexedDB(二:索引)

    在HTML5本地存储--IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器--索引. 熟悉数据库的同学都知道索引的一个好处 ...

  2. HTML5本地存储——IndexedDB

    在HTML5本地存储--Web SQL Database提到过Web SQL Database实际上已经被废弃,而HTML5的支持的本地存储实际上变成了 Web Storage(Local Stora ...

  3. HTML5本地存储——Web SQL Database

    在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...

  4. HTML5本地存储不完全指南

    历史 在HTML5本地存储之前,如果我们想在客户端保存持久化数据,有这么几个选择: HTTP cookie.HTTP cookie的缺点很明显,最多只能存储4KB的数据,每个HTTP请求都会被传送回服 ...

  5. HTML5 本地存储

    HTML5 本地存储 1.sessionStorage 2.localStorage 3.Database Storage 4.globalStorage 5.兼容性 参考文献 本地持久化存储一直是本 ...

  6. HTML5本地存储之Web Storage篇

    2019独角兽企业重金招聘Python工程师标准>>> Web Storage是HTML5引入的一个非常重要的功能,在前端开发中经常用到,可以在客户端本地存储数据,类似HTML4的c ...

  7. html5储存类型,html5本地存储-留言板

    HTML5每日一练之JS API-本地存储LocalStorage 留言板 | 前端开发网(W3Cfuns.com)! var Storage = { saveData:function()//保存数 ...

  8. HTML5 本地存储和内容按需加载的思路和方法

    HTML5 本地存储和内容按需加载的思路和方法 作者:佚名 字体:[增加 减小] 来源:互联网 时间:04-07 16:05:09 我要评论 本文将着重介绍HTML5本地存储和内容按需加载的思路和方法 ...

  9. HTML5本地存储使用详解

    HTML5本地存储使用详解 前言 随着Web应用的发展,需要在用户本地浏览器上存储更多的应用数据,传统的cookie存储的方案已经不能满足发展的需求,而使用服务器端存储的方案则是一种无奈的选择.HTM ...

  10. HTML5 本地存储 localstorage 安全分析

    在HTML5本地存储出现以前,WEB数据存储的方法已经有很多,比如HTTP Cookie,IE userData,Flash Cookie,Google Gears.其实再说细点,浏览WEB的历史记录 ...

最新文章

  1. boost::geometry::range_by_section用法的测试程序
  2. P6773-[NOI2020]命运【线段树合并,树形dp】
  3. 工程电磁场与电磁波第1章——矢量分析
  4. python include的功能_在Python的Config中增加Include功能
  5. mysql转达梦7_从mysql换成达梦7后,查询语句报错,这个是druid的问题吗
  6. 【MySQL】明明加了索引,为何不生效?
  7. iPhone 的倒计时竟然会显示假时间?
  8. 龙芯提供的jna-4.5.2,没有libjnidispatch.so,也能用
  9. 机器学习相关博客收藏(KL 散度、信息熵、谱聚类、EM、Isolation Kernel、iForest、元学习、小样本学习、课程学习)
  10. mysql的新特性_MySQL 8.0的关系数据库新特性详解
  11. 国稻种芯百团计划行动 胡培松:早稻可以向用途多元化发展
  12. PrintWriter out= response.getWriter()失效无法在前端弹出提示框以及乱码问题.
  13. linux的iptable开启命令,linux防火墙查看状态firewall、iptable
  14. 七夕第一波狗粮来啦!魏晨晒婚纱照,与妻子爱情长跑十年成眷属
  15. 穿越之我是码农 1024 篇
  16. string类 string.h头文件 cstring头文件区别以及读取一行字符串总结
  17. 数据仓库ETL工具箱——元数据
  18. 晶体生长需要解决的13个问题
  19. 物联网流量池_物联网卡流量池
  20. 亚马逊首席技术官:开发者可以像詹姆斯·邦德一样征服整个世界

热门文章

  1. Unity3D跑马灯脚本
  2. Modelsim仿真教程
  3. orcad电路设计软件教程
  4. 滤波器: 滤波器设计软件
  5. 1.封包(二)(雷电模拟器+ProxyDroid+CCProxy+WPE) 的使用
  6. 人力资源数据分析师前景_HR熬出头了!人力资源数据分析师年薪18万-90万
  7. android 手机型号 命名规则,自己整理:各大品牌安卓手机的型号命名规律
  8. 华为交换机配置链路聚合实验——Eth Trunk
  9. 单片机烧录文件的几种格式
  10. CAD教程:CAD软件中如何设置线缆?