简介

其实这不但单是个使用教程,同时我还做了idexdb的封装。

直接引用使用即可。

如果你不想理解库、表、记录的概念。

可以,因为我都默认给值了

你需要做的就是

indexdbHelper.saveOrUpdate({xx:xx}) // 即可存储数据
indexdbHelper.remove() // 即可删除存储内容

核心代码(直接copy到你项目中)    indexdb-helper.js

// 默认数据库为myDB
// 默认表为global
// 记录的id不传,默认为global let db = null; const init = (tableName = 'global', dbName = 'myDB') => {
// 使用 IndexedDB 的第一步是打开数据库
const request = window.indexedDB.open(dbName); return new Promise((resolve, reject) => {
request.onerror = function (event) { // 错误处理
console.log(' 打开数据库报错');
reject();
};
request.onsuccess = function (event) { // 成功处理
db = event.target.result;
createTable(tableName);
console.log('打开数据库成功');
resolve(db);
}; // 通过 监听[数据库升级事件]拿到 数据库实例
request.onupgradeneeded = function (event) {
db = event.target.result;
createTable(tableName);
console.log('onupgradeneeded');
resolve(db);
}
})
} // 创建表
const createTable = (tableName = 'global', keyPath = 'id') => {
// 先判断一下,这张表格是否存在,如果不存在再新建
if (!db.objectStoreNames.contains(tableName)) { // 创建一个人的表,id为主键
db.createObjectStore(tableName, { keyPath });
}
} // 增
const save = (data, tableName = 'global') => {
!data.id && (data.id = 'global')
const request = db.transaction([tableName], 'readwrite').objectStore(tableName).add(data);
return new Promise((resolve, reject) => {
request.onsuccess = function (event) {
console.log('数据写入成功');
resolve(event);
};
request.onerror = function (event) {
console.log('数据写入失败');
reject(event);
}
})
} // 删
const remove = (id = 'global', tableName = 'global') => {
const request = db.transaction([tableName], 'readwrite')
.objectStore(tableName)
.delete(id); return new Promise((resolve, reject) => {
request.onsuccess = function (event) {
console.log('数据删除成功');
resolve(true);
};
request.onerror = function (event) {
console.log('数据删除失败');
reject(event)
}; }) } // 改
const update = (data, tableName = 'global') => {
!data.id && (data.id = 'global')
const request = db.transaction([tableName], 'readwrite')
.objectStore(tableName)
.put(data); return new Promise((resolve, reject) => {
request.onsuccess = function (event) {
console.log('数据更新成功');
resolve(event);
};
request.onerror = function (event) {
console.log('数据更新失败');
reject(event);
}
})
} // 新增或改(没有则插入,有则更新--必须包含主键,没有的话id默认为global)
const saveOrUpdate = async (data, tableName = 'global') => {
!data.id && (data.id = 'global')
const res = await read(data.id);
if (res) {
console.log('存在数据,即将更新')
return update(data, tableName)
} else {
console.log('不存在数据,即将新增')
return save(data, tableName)
}
} // 查
const read = (id = 'global', tableName = 'global') => {
return new Promise((resolve, reject) => {
const transaction = db.transaction([tableName]);
var objectStore = transaction.objectStore(tableName);
var request = objectStore.get(id);
request.onerror = function (event) {
console.log('事务失败');
reject(event)
};
request.onsuccess = function (event) {
if (request.result) {
resolve(request.result)
} else {
console.log('未获得数据记录');
resolve(null)
}
};
})
} // 查询所有(创建一个游标,类似JAVA里面的容器遍历的iterator()就是一个性能,估计发明IndexDB的作者可能的认真学过JAVA,这里纯属虚构,忽略,忽略...... )
const readAll = (tableName = 'global') => {
return new Promise((resolve, reject) => {
const objectStore = db.transaction(tableName).objectStore(tableName);
const result = [];
objectStore.openCursor().onsuccess = function (event) {
const cursor = event.target.result;
if (cursor) {
const otherIf = {
db: cursor.source.transaction.db.name,
table: cursor.source.name
}
result.push({ value: cursor.value, otherIf });
cursor.continue();
} else {
resolve(result)
}
};
})
} const indexdbHelper = {
db, //数据库对象
init, // 初始化数据库连接
createTable, // 创建表(一般无需使用)
save, // 插入记录(参数不传,默认为myDb库下global表中的 id为global的记录)
update, // 更新记录(参数不传,默认为myDb库下global表中的 id为global的记录)
saveOrUpdate,// 新增或更新
read, // 查询(参数不传,默认为myDb库下global表中的 id为global的记录)
readAll,// 查询指定表下的所有
remove // 删除记录(参数不传,默认为myDb库下global表中的 id为global的记录)
}
window.indexdbHelper = indexdbHelper;
export default indexdbHelper;

使用方式

不管是vue还是react,都要在根实例初始化前,对indexDb初始化操作,这里拿react为例子

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import indexdbHelper from './utils/indexdb-helper'; // indexdb连接成功后再初始化app
indexdbHelper.init().then((res)=>{
ReactDOM.render(
<App />,
document.getElementById('root')
);
reportWebVitals();
})

开始使用

app.jsx

import './App.less';
import React, { useState, useEffect } from 'react';
import { Modal, Button, Card, Result, message } from 'antd';
import { codeMirrorOpt, jsonParse } from './utils/helper';
import indexdbHelper from './utils/indexdb-helper';
import { Controlled as CodeMirror } from 'react-codemirror2';
require('codemirror/mode/javascript/javascript'); function App() {
useEffect(() => {
syncUsers();
}, [])
const [isModalVisible, setIsModalVisible] = useState(false);
const [users, setUsers] = useState([]);
const [code, setCode] = useState('{}');
const [btnAdd, setBtnAdd] = useState(true); const syncUsers = async () => {
const users = await indexdbHelper.readAll();
console.log(users);
setUsers(users);
} const editUser = async (id) => {
const user = await indexdbHelper.read(id);
setBtnAdd(false);
console.log(JSON.stringify(user));
setCode(JSON.stringify(user));
setIsModalVisible(true)
} const addUser = async () => {
setBtnAdd(true);
setCode('{}');
setIsModalVisible(true)
} const deleteUser = async (id) => {
await indexdbHelper.remove(id);
syncUsers();
} // 弹窗配置项
const modelHelper = {
title: btnAdd?'新增记录':'编辑记录',
visible: isModalVisible,
async onOk() {
const codeJson = jsonParse(code);
if(!codeJson?.id){
message.warning('id作为主键,必须存在。如果没有,默认为global');
}
// btnAdd?await indexdbHelper.save(codeJson):await indexdbHelper.update(codeJson);
// 废弃上边的,用下边的我封装的牛逼方法
await indexdbHelper.saveOrUpdate(codeJson)
setIsModalVisible(false);
syncUsers();
},
onCancel() {
setIsModalVisible(false);
}
} // CodeMirror配置项
const codeMirror = {
value:code,
options: codeMirrorOpt,
onBeforeChange(editor, data, value) {
setCode(value)
}
} return (
<div className="App">
{users.length > 0 ?
<>
<Button type="primary" onClick={addUser}>新增记录</Button>
{users.map(({value: item,otherIf}) => {
const title = `库${otherIf.db}--表${otherIf.table}--主键为${item.id}的一条记录`;
return (<Card title={title} key={item.id} extra={<div>
<a onClick={() => { editUser(item.id) }}>
编辑
</a>
<a onClick={() => { deleteUser(item.id) }} style={{marginLeft:20}}>
删除
</a>
</div>}>
{JSON.stringify(item)}
</Card>
)})} </> :
<Result
status="warning"
title="indexDB数据库的表无记录"
extra={<Button type="primary" key="console" onClick={addUser}>
前去新增
</Button>}
/>
}
{isModalVisible && <Modal {...modelHelper}>
<div> 请输入json!</div>
<CodeMirror {...codeMirror}/>
</Modal>}
</div>
);
} export default App;

helper.js

// 代码编辑器配置项
export const codeMirrorOpt = {
mode: {
name: 'text/javascript'
},
theme: 'material',
lineNumbers: true
} // 解析不规范的json
export const jsonParse = (str)=>{
return eval("("+str+")");
}

代码

demo代码下载

https://gitee.com/dshvv/react-indexdb

效果

其它

如果你想用更全面的类库,推荐插件

http://localforage.docschina.org/

indexbd的简单使用(crud)的更多相关文章

  1. 8天掌握EF的Code First开发系列之2 简单的CRUD操作

    本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 创建控制台项目 根据.Net中的类来创建数据库 简单的CRUD操作 数据库模式更改介绍 本章小结 本人的实验环境 ...

  2. spring集成mongodb封装的简单的CRUD

    1.什么是mongodb         MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB MongoDB是一个介 ...

  3. Mongodb系列- java客户端简单使用(CRUD)

    Mongodb提供了很多的客户端: shell,python, java, node.js...等等. 以 java 为例实现简单的增删改查 pom文件: <dependencies> & ...

  4. springboot + mybatis 的项目,实现简单的CRUD

    以前都是用Springboot+jdbcTemplate实现CRUD 但是趋势是用mybatis,今天稍微修改,创建springboot + mybatis 的项目,实现简单的CRUD  上图是项目的 ...

  5. 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作

    这里利用Hibernate操作数据库完毕简单的CRUD操作. 首先,我们须要先写一个javabean: package cn.itcast.domain; import java.util.Date; ...

  6. 简单的CRUD(二)

    一.重构简单的CRUD 1.JDBC工具类 1.因为在crud中都包含一些相同的代码所以可以提取出来,抽取代码重构为工具类. 2.将工具类设置为static静态类,方便调用,不需要new对象. pub ...

  7. 简单的CRUD(一)

    一.JDBC的概述--(来源于百度) JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问, ...

  8. Springboot项目搭建(1)-创建,整合mysql/oracle,druid配置,简单的CRUD

    源码地址:https://github.com/VioletSY/article-base 1:创建一个基本项目:https://blog.csdn.net/mousede/article/detai ...

  9. ASP.NET Core MVC+Layui使用EF Core连接MySQL执行简单的CRUD操作

    前言: 本章主要通过一个完整的示例讲解ASP.NET Core MVC+EF Core对MySQL数据库进行简单的CRUD操作,希望能够为刚入门.NET Core的小伙伴们提供一个完整的参考实例.关于 ...

  10. Mybatis实现简单的CRUD(增删改查)原理及实例分析

    Mybatis实现简单的CRUD(增删改查) 用到的数据库: CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user` ...

随机推荐

  1. 画个Shape留意到的东西

    这几个知识点 在 CoreGraphics 框架中有这样一个方法: public func addArc(center: CGPoint, radius: CGFloat, startAngle: C ...

  2. 【Linux】基于Exynos4412的U-Boot引导程序移植

    [Linux]基于Exynos4412的U-Boot引导程序移植 零.准备 首先我们得去下载好U-Boot的源码,因为用的芯片是2012年出的Exynos4412,因此我们选择这个时间节点附近的U-B ...

  3. cglib 代理类自己equals自己 返回false问题

    问题: 通过debug发现result.removeAll的时候 删不了 public boolean equals(Object obj) { return obj instanceof OspSp ...

  4. ES6 Fielddata is disabled on text fields by default

    使用ES做聚合运算的时候,有时候会遇到这个错误 Fielddata is disabled on text fields by default. Set fielddata=true on [host ...

  5. Flex布局教程:语法篇--css中的display:Flex

    先用一句话秒懂display:Flex;这句css代码,如图: 放个目录先: 目录 一.Flex布局是什么? 二.基本概念 三.容器的属性 3.1 flex-direction属性(主轴的方向) 3. ...

  6. win mysql实现主从同步(精简版)

    最近项目要弄读写分离,那首先要实现主从同步啊,网上教程很多,但大多都看得云里雾里,so,有了这个精简版: 主库my.ini添加配置: #数据库ID号, 为1时表示为Master,其中master_id ...

  7. 关闭windows10 Alt+Tab开打edge选项卡

    发现最近更新的windows10会使用快捷键Alt+Tab打开Edge的选项卡,很不适应,可喜的是微软提供了关闭的方法. 设置⚙->系统->多任务处理->Alt+Tab 设置为仅打开 ...

  8. 重载(Overloading)与重写(Override)的区别?

    重载(Overloading)与重写(Override)的区别? No. 区别 重载 重写 1 英文单词 Overloading Override 2 发生范围 发生在一个类里面 发生在继承关系中 3 ...

  9. 【BUG】Hexo|GET _MG_0001.JPG 404 (Not Found),hexo博客搭建过程图片路径正确却找不到图片

    我的问题 我查了好多资料,结果原因是图片名称开头是_则该文件会被忽略...我注意到网上并没有提到这个问题,遂补了一下这篇博客并且汇总了我找到的所有解决办法. 具体检查方式: hexo生成一下静态资源: ...

  10. 【记录】博客|Markdown写作常用的符号表示、公式写法合集

    文章目录 基础内容Basic 1.符号合集 2.LaTeX公式输入 附加内容Addition 1.公式左对齐 2.Markdown文档导出的PDF分页 基础内容Basic 1.符号合集 LATEX M ...