indexbd的简单使用(crud)
简介
其实这不但单是个使用教程,同时我还做了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)的更多相关文章
- 8天掌握EF的Code First开发系列之2 简单的CRUD操作
本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 创建控制台项目 根据.Net中的类来创建数据库 简单的CRUD操作 数据库模式更改介绍 本章小结 本人的实验环境 ...
- spring集成mongodb封装的简单的CRUD
1.什么是mongodb MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB MongoDB是一个介 ...
- Mongodb系列- java客户端简单使用(CRUD)
Mongodb提供了很多的客户端: shell,python, java, node.js...等等. 以 java 为例实现简单的增删改查 pom文件: <dependencies> & ...
- springboot + mybatis 的项目,实现简单的CRUD
以前都是用Springboot+jdbcTemplate实现CRUD 但是趋势是用mybatis,今天稍微修改,创建springboot + mybatis 的项目,实现简单的CRUD 上图是项目的 ...
- 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作
这里利用Hibernate操作数据库完毕简单的CRUD操作. 首先,我们须要先写一个javabean: package cn.itcast.domain; import java.util.Date; ...
- 简单的CRUD(二)
一.重构简单的CRUD 1.JDBC工具类 1.因为在crud中都包含一些相同的代码所以可以提取出来,抽取代码重构为工具类. 2.将工具类设置为static静态类,方便调用,不需要new对象. pub ...
- 简单的CRUD(一)
一.JDBC的概述--(来源于百度) JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问, ...
- Springboot项目搭建(1)-创建,整合mysql/oracle,druid配置,简单的CRUD
源码地址:https://github.com/VioletSY/article-base 1:创建一个基本项目:https://blog.csdn.net/mousede/article/detai ...
- ASP.NET Core MVC+Layui使用EF Core连接MySQL执行简单的CRUD操作
前言: 本章主要通过一个完整的示例讲解ASP.NET Core MVC+EF Core对MySQL数据库进行简单的CRUD操作,希望能够为刚入门.NET Core的小伙伴们提供一个完整的参考实例.关于 ...
- Mybatis实现简单的CRUD(增删改查)原理及实例分析
Mybatis实现简单的CRUD(增删改查) 用到的数据库: CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user` ...
随机推荐
- SpringBoot校验请求Json参数
spring boot 校验请求json参数 在后端开发中,通过接口和参数传输来进行与前端交互,才可以让一个项目成型. 由于全后端隔离的方式,所以有时候需要不那么信任前端,也就是在验证当前操作是否有权 ...
- P5490 【模板】扫描线 & 矩形面积并 做题笔记
扫描线是一种很常用的 trick,用来计算矩形并周长.并面积.核心思路是使用标记永久化 + 线段树,直接引用朴素的做法,即从某一维度开始扫描并将经过的面积加和. 错误 upd 函数中的汇总不正确,要想 ...
- FastAPI依赖注入系统及调试技巧
title: FastAPI依赖注入系统及调试技巧 date: 2025/04/11 15:00:50 updated: 2025/04/11 15:00:50 author: cmdragon ex ...
- ThreadPoolExecutor的内部类Worker详细解析
一.定义 ThreadPoolExecutor 的内部类 Worker 是线程池的核心实现之一,它封装了线程和任务,并负责执行任务.Worker 类继承自 AbstractQueuedSynchron ...
- @Accessors lombok注解用法
最近学习代码看到很多有趣的注解:慢慢整理下: @Accessors注解 @Accessors注解官方给出的解释是:面向getter和setter的更流畅的API.用于生成和查找getter和sette ...
- EF Core Day1 ——DbContext初识
------------恢复内容开始------------ EF中的上下文(DbContext)简介 DbContext是实体类和数据库之间的桥梁,DbContext主要负责与数据交互,主要作用 ...
- codeup之冒泡排序
Description 从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大). Input 以空格分隔的10个整数 Output 依次输出排好序的10个整数,每个数占一行. Sample ...
- codeup之数组元素原地逆置
Description 将一个长度为10的整型数组中的值按逆序重新存放. 如:原来的顺序为1,2,3,4,5,6,7,8,9,0,要求改为0,9,8,7,6,5,4,3,2,1 Input 从键盘上输 ...
- JXOI2021游记
JXOI2021游记 day0 虽然说退役的概率比较大,但是我不想.唉,这也不是说不想就可以避免的事情呐-- 总之我希望我稳一点就好-- day1 考场上 依照教练说的,先把三道题都看完再动笔. 看T ...
- Burp Suite 企业级深度实战教程
第一部分:环境搭建与高级配置 1.1 专业版激活与插件生态 # 专业版激活(Linux) java -jar -Xmx2048m burpsuite_pro.jar --activate --acti ...