nodejs34: react中的IndexedDB 数据库遍历 + 实现对数据库的复制与更新

前端犄角旮旯,非常规面试题总结(不断更新....) 27、判断类型的方式有哪些?1、typeof操作符:用来检测数据的类型,返回的是一个表示类型的字符串。2、instanceof操作符:用来检测对象是否为指定的构造函数的实例。3、方法:可以返回对象的准确类型。4、方法:用来判断一个变量是否为数组。(一)typeof和instanceof区别typeof返回的是一个字符串,表示变量的数据类型,可能的返回值有numberstringbooleanfunctionundefinedobject。instanceof返回的是一个布尔值,true或。 阅读详情

IndexedDB 数据库遍历

  // 读取指定存储对象"表格"的数据
  const readTableData = async (TableName) => {
    try {
      const db = await openDB(DB_NAME, DB_VERSION);
      console.log(db,"db")
      const tx = db.transaction(TableName, 'readonly');
      const store = tx.objectStore(TableName);
      const items = await store.getAll();
      console.log(`${TableName}的数据:`, items);
      return items;
    } catch (error) {
      console.error(`读取${TableName}数据时出错:`, error);
      return [];
    }
  };

    // 读取所有数据
    const readAllDBData = async () => {
      try {
        const db = await openDB(DB_NAME, DB_VERSION);
        const tableNames = await db.objectStoreNames;// 一个DOMStringList对象 https://developer.mozilla.org/zh-CN/docs/Web/API/DOMStringList
        // 遍历所有省份的DOMStringList
        for (const v of tableNames) {
          const items = await readTableData(v);
          console.log(`${v}的数据:`, items);
        }
        return null;
      } catch (error) {
        console.error(`读取数据时出错:`, error);
        return [];
      }
    };

完整React代码

import React, { useState } from 'react';
import { openDB } from 'idb';  // 确保你已经安装了 idb 库来操作 IndexedDB

const DB_NAME = 'yourDBName'; // 请根据你的实际情况替换
const DB_VERSION = 1; // 请根据你的实际情况替换

function App() {
  const [data, setData] = useState([]);

  // 读取指定存储对象"表格"的数据
  const readTableData = async (TableName) => {
    try {
      const db = await openDB(DB_NAME, DB_VERSION);
      console.log(db, "db");
      const tx = db.transaction(TableName, 'readonly');
      const store = tx.objectStore(TableName);
      const items = await store.getAll();
      console.log(`${TableName}的数据:`, items);
      return items;
    } catch (error) {
      console.error(`读取${TableName}数据时出错:`, error);
      return [];
    }
  };

  // 读取所有数据
  const readAllDBData = async () => {
    try {
      const db = await openDB(DB_NAME, DB_VERSION);
      const tableNames = Array.from(db.objectStoreNames);  // 将DOMStringList转化为数组
      const allData = [];
      // 遍历所有表名
      for (const tableName of tableNames) {
        const items = await readTableData(tableName);
        allData.push({ tableName, items });
        console.log(`${tableName}的数据:`, items);  // 打印每个表的数据
      }
      setData(allData); // 设置读取的数据
    } catch (error) {
      console.error('读取数据时出错:', error);
    }
  };

  return (
    <div>
      <h1>数据库数据读取</h1>
      <button onClick={readAllDBData}>读取所有数据</button>
      <div>
        {data.length > 0 && (
          <div>
            <h2>读取的所有数据:</h2>
            <ul>
              {data.map((tableData, index) => (
                <li key={index}>
                  <h3>{tableData.tableName}</h3>
                  <pre>{JSON.stringify(tableData.items, null, 2)}</pre>
                </li>
              ))}
            </ul>
          </div>
        )}
      </div>
    </div>
  );
}

export default App;

实现对数据库的复制与更新

import React, { useState } from 'react';
import { openDB } from 'idb';  // 确保你已经安装了 idb 库来操作 IndexedDB

const DB_NAME = '**';
const DB_VERSION = 2;//!!!

const NEW_DB_NAME = '***';
const NEW_DB_VERSION = 3;//!!!

function App() {
  const [data, setData] = useState([]);


  // 数据库结构复制
  const copyDatabaseStructure = async (sourceDBName, targetDBName, dbVersion) => {
    try {
      // 打开源数据库
      const sourceDB = await openDB(DB_NAME, DB_VERSION);
      // 打开目标数据库
      const targetDB = await openDB(targetDBName, dbVersion, {
        upgrade(db) {
          // 获取源数据库的所有表格结构
          const sourceTableNames = Array.from(sourceDB.objectStoreNames);

          sourceTableNames.forEach((tableName) => {
            const store = sourceDB.transaction(tableName, 'readonly').objectStore(tableName);
            const newStore = db.createObjectStore(tableName, {
              keyPath: store.keyPath,
              // autoIncrement: store.autoIncrement, //不使用自增id
            });

            // // 为每个表格复制索引结构
            // store.indexNames.forEach((indexName) => {
            //   const index = store.index(indexName);
            //   newStore.createIndex(indexName, index.keyPath, index.options);
            // });
          });
        },
      });

      console.log(`成功复制数据库结构: ${sourceDBName} -> ${targetDBName}`);
    } catch (error) {
      console.error('复制数据库结构时出错:', error);
    }
  };




  // 读取指定存储对象"表格"的数据
  const readTableData = async (TableName,index) => {
    try {
      const db = await openDB(DB_NAME, DB_VERSION);
      console.log(db, "db");
      const tx = db.transaction(TableName, 'readonly');
      const store = tx.objectStore(TableName);
      const items = await store.getAll();
      console.log(`${TableName}的数据:`, items);

      const newDB = await openDB(NEW_DB_NAME, NEW_DB_VERSION);
      const newtx = newDB.transaction(TableName, 'readwrite');
      const newstore = newtx.objectStore(TableName);

      let newindex = 0 ;
      // 插入数据到NEW_DB_NAME
      items.forEach(item => {
        // 去除item中的id
        const { id, ...Item } = item;  
        const newItem = { ...item, id: newindex }; // 设置新的 id,示例是按顺序设置(你可以自定义生成 id 的规则)
        newindex = newindex + 1
        newstore.put(newItem); // 使用 put 插入或更新数据
      });
      await tx.done; // 确保事务完成
      console.log(`数据成功插入到${NEW_DB_NAME}中的${TableName}表格`);

      return items;
    } catch (error) {
      console.error(`读取${TableName}数据时出错:`, error);
      return [];
    }
  };

  // 读取所有数据
  const readAllDBData = async () => {
    // 调用函数,复制数据库结构到NEW_DB_NAME
    copyDatabaseStructure(DB_NAME, NEW_DB_NAME, NEW_DB_VERSION);
    // 遍历原有数据库的表格
    try {
      const db = await openDB(DB_NAME, DB_VERSION);
      const tableNames = Array.from(db.objectStoreNames);  // 将DOMStringList转化为数组
      const allData = [];
      // 遍历所有表名
      for (const [index, tableName] of tableNames.entries()) {
        const items = await readTableData(tableName,index);// 遍历表格中的数据
        allData.push({ tableName, items });
        console.log(`第${index + 1}个`, `${tableName}的数据:`, items);  // 打印每个表的数据,并显示索引
      }
      setData(allData); // 设置读取的数据
    } catch (error) {
      console.error('读取数据时出错:', error);
    }
  };

  return (
    <div>
      <h1>数据库数据读取</h1>
      <button onClick={readAllDBData}>读取所有数据</button>
      <div>
        {data.length > 0 && (
          <div>
            <h2>读取的所有数据:</h2>
            <ul>
              {data.map((tableData, index) => (
                <li key={index}>
                  <h3>{tableData.tableName}</h3>
                  <pre>{JSON.stringify(tableData.items, null, 2)}</pre>
                </li>
              ))}
            </ul>
          </div>
        )}
      </div>
    </div>
  );
}

export default App;

CG

nodejs-idb-connector:一个JavaScript(Node.js)库,用于与IBM i的Db2通信,并支持查询,过程等。 使用传统的回调样式语法 适用于IBM i的Node.js iDB连接器 Node.js iDB连接器是来自IBM的IBM i Node.js Db2驱动程序开源项目 安装 npm i idb-connector 注意此软件包仅安装在IBM i系统上。 然后,您可以在代码中要求,如下所示。 const db = require ( 'idb-connector' ) ; 快速范例 示例1:使用exec()API获取数据 const { dbconn , dbstmt } = require ( 'idb-connector' ) ; const sSql = 'SELECT STATE FROM QIWS.QCUSTCDT' ; const connection = new dbconn ( ) ; connection . conn ( '*LOCAL' ) ; 立即下载

相关推荐

HALCON基于描述符的模板匹配(未标定)

HALCON基于不标定描述符的模板匹配

king_linj的博客 890

IDB 开源项目指南

IDB(由dmayer维护)是一个围绕Electron构建的用于在Node.js环境中执行IndexedDB操作的库。这个项目旨在填补Node.js环境中原生不支持IndexedDB这一空白,使得开发者能够在服务器端或混合应用程序中利用IndexedDB的强大本地存储能力。通过IDB,开发者可以实现离线数据处理、缓存以及数据同步等功能,增强了web应用的可扩展性和脱机工作能力。 ## 项目快速启...

gitblog_00238的博客 631

别再只跑memtester了!嵌入式Linux内存压力测试,这5个参数和场景你试过吗?

本文深入探讨了嵌入式Linux内存压力测试的高级技巧,重点解析了memtester工具的5个关键参数和实战场景。通过物理地址测试、迭代控制、内存分配策略等调优方法,帮助开发者有效检测内存稳定性问题,适用于长期运行设备、特定故障重现等复杂场景,提升嵌入式系统可靠性。

weixin_30838873的博客 424

nodejs33: react中的IndexedDB 原有API+操作库idb+数据库事务

存储键值对。支持事务。数据可以分层组织为数据库、对象存储(Object Stores)和索引(Indexes)。原生IndexedDB API更灵活,但代码较为复杂。如果需要在项目中频繁操作 IndexedDB,idb是一个轻量但功能强大的选择;如果需要更复杂的查询和事务管理,Dexie(npm install dexie) 会更适合。

ResumeProject的博客 1546

当AI换脸遇上内容审核:Facefusion NSFW检测的技术伦理与用户自主权之争

本文探讨了Facefusion开源AI换脸工具中NSFW检测机制的技术伦理困境与用户自主权之争。分析了其多层次防御机制的技术实现与社区规避方法,揭示了开源软件在安全与自由之间的平衡难题,并提出了分层权限设计等社区实践方案。

weixin_29165725的博客 687

Excel-MCP实战指南:零代码实现大模型与Excel的智能交互

本文详细介绍了Excel-MCP工具如何实现大模型与Excel的无缝交互,无需编写代码即可完成数据读写、图表生成等复杂操作。通过实战案例展示了Excel-MCP在销售报表自动化、财务对账等企业级场景中的应用,大幅提升工作效率。文章还提供了安装指南、核心功能解析和常见问题解决方案。

weixin_29212429的博客 433

html5 IndexedDB

indexedDB类似nosql的数据库,是面向索引的数据库,相对于web storage,它为web离线存储提供大数据存储和搜索。浏览器兼容性使用步骤 打开一个数据库 获取数据库对象 通过数据库打开一个事务 通过事务进行数据库结构和数据的操作 操作数据之前,我们先建立一个数据库/** * 创建数据库 */ function createDB(){ var openReq = windo

打不死的小强 1986

双目相机立体匹配算法概述(含Python代码)

立体匹配任务是计算机视觉中的一个重要问题,旨在从一对具有相同场景的图像中估计每个像素的视差(disparity)。本文对现有的传统算法和深度学习算法进行了综述,以便于各位选择合适的立体匹配算法用于深度估计或三维建模。

m0_59257547的博客 8292

indexedDB 导出文件到其他电脑导入

indexDB 导出文件到其他电脑导入

weixin_42900858的博客 2355

手把手教你学simulink(8.3)--实例:基于 Simulink 的自动驾驶汽车速度控制系统设计与仿真

基于 Simulink 的自动驾驶汽车速度控制系统设计与仿真。

MHD0815的博客 1208

从扩散到流匹配:具身智能中的生成模型原理与实现细节(具身智能/VLA/机器人面试常考)

本文探讨了生成模型在具身智能中的应用,重点对比了扩散模型和流匹配(Flow Matching)两种方法。扩散模型通过逐步加噪和去噪过程学习数据分布,建模能力强但采样速度慢;而Flow Matching直接学习连续向量场,更适合实时轨迹规划等需要快速连续生成的任务。文章还分析了自注意力机制的优势、ROS1/ROS2通信架构差异,并提供了Flow Matching的PyTorch实现代码。这些生成模型使机器人系统能够处理不确定性、多模态信息和连续控制问题,从传统的确定解转向更灵活的分布建模范式。

m0_51738372的博客 235

indexDB插件idb-easy,简化操作

idb-easy一个简单易用的 IndexedDB 封装库,旨在简化数据库操作,使开发者能够方便地进行数据存储和检索。通过提供实例化的 API,可以轻松管理和操作 IndexedDB 数据库。

m0_66939000的博客 1315

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景,在 Windows Presentation Foundation(WPF)开发中,依赖项属性是一个核心且强大的特性,它为构建灵活、可扩展的用户界面提供了关键支持。理解并熟练运用依赖项属性,对于开发高效、健壮的 WPF 应用程序至关重要。本文将深入探讨 WPF 依赖项属性,通过丰富的代码示例和对关键概念的详细解释,帮助读者全面掌握这一重要特性及其应用场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

BroadcastChannel API:浏览器原生多标签页通信实战指南

BroadcastChannel 是现代浏览器提供的原生客户端通信机制,基于同源策略实现窗口、iframe 与 Web Worker 间的轻量广播。其底层依托浏览器 IPC 通道,规避 DOM 事件循环,相比 localStorage + storage 事件具备更低延迟(<10ms)和更高可靠性。作为 JavaScript API,它无需服务端参与、不触发跨域限制,天然适配 PWA、微前端及多标签页协同场景,如购物车同步、登录态通知与播放进度共享。本文聚焦 BroadcastChannel 的工程落地,涵

weixin_34216107的博客 468

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

脑语言2500单字v1.5.1

如果人和 AI 说同一种语言,文明会怎样?我用 2500 个单字试了试。2500个单字是不同领域、不同知识的共同体,无论你学编程或者是数学或写作,你都要用汉字,而常用的2500个汉字几乎可以涵盖不同行业做的不同事情。

脑语言 2006

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

indexedDB(三)查询(详细)篇

前言 上篇讲了简单的创建了一个数据库和两个表,这里就详细记录下查询; 这里先定义二个数组对象 data(){ return { arr:[ {id:1,name:'杨姐',age:18,sex:0}, {id:2,name:'骏驰',age:33,sex:0}, {id:3,name:'king',age:45,sex:1}, {id:4,name:'浩杰',age:16,sex:0}, {id:5,name

qq_38935512的博客 7342

IndexedDB数据库

IndexedDB是一种轻量级的nosql数据库,不需要固定的表结构,通常也不存在连接操作。 在浏览器f12下的application下storage下的indexedDB中 indexDB中包含若干个对象仓库,它类似于关系型数据库的表格,对象仓库保存的是数据记录。每条记录类似于关系型数据库的行,但是只有主键和数据体两部分,主键用来建立默认的索引,必须是不同的。主键可以是数据记录里面的一个属性,也可以指定为一个递增的整数编号 不是所有的浏览器都支持indexDB数据库,所以在使用是最好加一个判断操作 if(

紫月i的博客 1223

浏览器数据库IndexedDB

概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据。 Cookie 的大小不超过4KB,且每次请求都会发送回服务器; LocalStorage 在 2.5MB 到 10MB 之间(各家浏览器不同),而且不提供搜索功能,不能建立自定义的索引。 所以,需要一种新的解决方案,这就是 IndexedDB 诞生的背景。 IndexedDB 就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB 允许储存大量数据,提供查找

weixin_43901781的博客 2766

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 327

React 错误边界 Error Boundary

用类组件 ErrorBoundary 隔离渲染错误,讲清能接住/接不住、重置策略与上报。

JudithHuang的博客 297

【SpringAI Alibaba】ReactAgent响应SSE实时流式传输案例实战

SSE 是单向推送(服务器→客户端),无法客户端→服务器实时发送;双向需用 WebSocket。SSE 是 HTML5 标准,服务器向客户端推送事件流,单向通信,适合流式输出场景。流式输出让用户看到 AI "边想边写",首字响应时间大幅降低(通常在 1 秒内)大模型响应通常需要几秒甚至几十秒,如果等全部生成完再返回,用户体验极差。流式输出中发生异常,要及时关闭流并通知客户端,避免客户端永久等待。,否则 SSE 不会实时推送。

qq_38196449的博客 211

React 鉴权路由守卫直觉

用布局路由 + Navigate 做登录拦截和登录回跳,并说明前端守卫不是安全边界。

JudithHuang的博客 122

我写了一个 Windows 开发环境管理平台:Nexus(Tauri 2 + Rust + React)

文件监听事件很密集。如果节流窗口内的变更直接丢弃,最后一次改动就永远加载不到——所以窗口结束时必须补一轮。只对「失败」重试,不对「启动中」重试。启动慢不代表启动失败,盲目重试只会把健康的服务越搞越糟。Nexus 原本是为了解决自己日常开发里「窗口太多、状态不清、日志找不到」的问题,后来慢慢补成了现在这个样子:项目与服务管理、日志、服务健康、文件与代码查看、文件监听、开机启动、Node 版本管理,以及一个内嵌的 AI 助手。如果你也在 Windows 上同时维护多个服务,欢迎试用。

hi星尘的博客 567

React Fragment与空标签的终极对比

在React类式组件中,<div>是渲染时必需的外层标签,但可通过Fragment或空标签<></>避免额外DOM节点。Fragment支持传入key,适用于列表遍历场景,而空标签不支持key,且仅允许key属性。两者均可减少冗余标签,提升性能与结构清晰度。

var_let_const的博客 186

Linux网络学习【Reactor反应堆模式】

本文围绕 Linux 网络编程中的 Reactor 反应堆模式展开,以“事件驱动—组件协作—线程模型—代码实践”为主线,解析事件源、多路复用器、事件分发器与处理器的协作机制,梳理等待就绪、事件分发与回调执行流程,对比单 Reactor 单线程、单 Reactor 多线程及主从 Reactor 的组织方式。结合 epoll 与非阻塞读写,分析事件注册、连接接收、缓冲区管理、部分收发及资源清理,厘清就绪通知与操作完成的区别,讨论耗时任务对事件循环的影响,为构建结构清晰、便于扩展的并发网络服务器提供实践思路。

承于所学,探技术之渊;以代码求政,寻成长之道。 1万+
上一篇: webassembly003 ggml GGML Tensor Library part-4 矩阵乘法的实现
下一篇: nodejs35: react中的IndexedDB 数据导出(JSON)与导入
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值