简介

其实这不但单是个使用教程,同时我还做了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. 第一次3D打印,一个简单的小方块(rhino)

    一.建模 打开犀牛,我们选择立方体 我们点击上册的中心点 输入0,然后回车0 而后我们输长度:10,回车确认 同样的,宽度10 高度同样是10 回车确认后,我们得到一个正方形 二.导出模型 我们选择文 ...

  2. 1678. 设计 Goal 解析器

    1678. 设计 Goal 解析器 class Solution { public String interpret(String command) { char[] ch = command.toC ...

  3. 通过cmd/批处理 开启关闭windows中的mysql数据库

    目录 cmd 开启关闭mysql 批处理 开启关闭mysql 每次通过服务开启关闭mysql太麻烦,可以通过cmd或批处理来解决 cmd 开启关闭mysql cmd需要使用管理员打开 //开启mysq ...

  4. 信息资源管理综合题之“某国企投资IT应用人员减少但生成率没有实质性变化的IT黑洞问题”

    一.某大型国企在IT应用上投资了2000万美元,虽然蓝领工人数量大幅减少,但实际生产率并未有实质性变化 1.企业在IT应用上的巨额投资并未达到预期目标的这种现象被称为什么? 2.产生这现象的原因有哪些 ...

  5. java数组--对象数组的随机赋值及其他

    包含考点: 对象数组的随机赋值 浮点数的指定位数 换用思路进行对象数组的某一属性进行排序 现有Book类,定义如下: private String author; private String ISB ...

  6. 张高兴的大模型开发实战:(六)在 LangGraph 中使用 MCP 协议

    目录 什么是 MCP 协议 MCP 协议与 API 调用的区别 MCP 协议的连接方式 SSE(Server-Sent Events) stdio(标准输入输出) 在 LangGraph 中使用 MC ...

  7. 搭建阅读linux源码的舒适环境(vscode+clangd)

    准备linux源码 linux官网下载源码压缩包 https://www.kernel.org/ 解压 由于源码是经过两次压缩的,所以需要解压两次 xz -d linux-6.14.7.tar.xz ...

  8. git命令--拉取代码和切换分支

      git一般有很多分支,我们clone到本地的代码都是master分支,那么如何切换到其它分支呢?本文介绍主要操作流程和命令,包括拉取仓库代码.查看分支和切换分支,至于如何提交代码,需要的童鞋自己查 ...

  9. Java HashMap和ConcurrentHashMap知识点梳理

    jdk 8 HashMap 扩容之后旧元素存放位置是? java 在扩容的时候会创建一个新的 Node<K,V>[],用于存放扩容之后的值,并将旧的Node数组(其大小记作n)置空:至于旧 ...

  10. 代码随想录第十天 | 栈与队列part02

      第五章 栈与队列part02 150. 逆波兰表达式求值 本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题 题目链接/文章讲解/视频讲解:https://programmerc ...