当前位置: 首页 > news >正文

Electron使用 SQLite

在客户端开发中,无论是 PC 端,还是手机端,为了能够访问离线数据,数据经常需要保存到本地,IndexDB 可以用于存储本地数据,IndexDB 是一个对象存储,数据是以 key:value 的形式进行存储和访问的,相对于关系型数据库,访问速度快,但是结构简单。对于一些复杂的模型,多表关联关系,用 IndexDB 实现会相对复杂,需要通过查询实现。所以在业务项目中,通过关系型数据库对业务数据进行建模,采用 SQL进行数据访问更加方便。

SQLite是客户端常用的文件型关系数据库,主流的移动端、桌面应用大多使用的 SQLite进行离线数据存储,例如微信。SQLite 是一个轻量级基于文件关系型数据库,主要有以下特点:

  • 支持标准 SQL
  • 文件无需服务器支持
  • 跨平台,Android、IOS、PC(Windows、Mac、Linux)
  • 不需要任何配置,安装上依赖直接可以使用

安装,默认 SQLite 是x86 编译的,在Mac M1 上试用会报错,所以我们需要对 SQLLite 进行重新编译。

npm install sqlite3 --build-from-source --target_arch=arm64 --fallback-to-build

Electron + SQLite 创建用户的例子:
index.html

<!DOCTYPE html>
<html>
<head><title>Electron SQLite CRUD</title>
</head>
<body><h1>User Management</h1><input id="username" type="text" placeholder="Username"><input id="age" type="number" placeholder="Age"><button onclick="createUser()">Create User</button><button onclick="getUsers()">Load Users</button><div id="users"></div><script>function createUser() {const username = document.getElementById('username').value;const age = document.getElementById('age').value;window.api.createUser(username, parseInt(age)); #进程间互相调用}async function getUsers() {const users = await window.api.getUsers();const usersDiv = document.getElementById('users');usersDiv.innerHTML = users.map(user => `<p>${user.username}, ${user.age} years old</p>`).join('');}</script>
</body>
</html>

main.js 主线程

const { ipcMain, app, BrowserWindow } = require('electron');
const path = require('path');
const sqlite3 = require('sqlite3').verbose();function createWindow() {const mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js'),}});mainWindow.loadFile('index.html');
}app.whenReady().then(createWindow);app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit();}
});app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}
});const db = new sqlite3.Database('userdata.db', (err) => {if (err) {console.error(err.message);}console.log('Connected to the userdata database.');db.run(`CREATE TABLE IF NOT EXISTS tb_user (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT,age INTEGER)`);
});ipcMain.on('create-user', (event, username, age) => {db.run(`INSERT INTO tb_user(username, age) VALUES(?, ?)`, [username, age]);
});ipcMain.handle('get-users', async (event) => {return new Promise((resolve, reject) => {db.all(`SELECT * FROM tb_user`, [], (err, rows) => {if (err) {reject(err);}resolve(rows);});});
});ipcMain.on('update-user', (event, id, username, age) => {db.run(`UPDATE tb_user SET username = ?, age = ? WHERE id = ?`, [username, age, id]);
});ipcMain.on('delete-user', (event, id) => {db.run(`DELETE FROM tb_user WHERE id = ?`, id);
});

IPC API

const { contextBridge, ipcRenderer } = require('electron');contextBridge.exposeInMainWorld('api', {createUser: (username, age) => ipcRenderer.send('create-user', username, age),getUsers: () => ipcRenderer.invoke('get-users'),updateUser: (id, username, age) => ipcRenderer.send('update-user', id, username, age),deleteUser: (id) => ipcRenderer.send('delete-user', id)}
);

相关文章:

Electron使用 SQLite

在客户端开发中&#xff0c;无论是 PC 端&#xff0c;还是手机端&#xff0c;为了能够访问离线数据&#xff0c;数据经常需要保存到本地&#xff0c;IndexDB 可以用于存储本地数据&#xff0c;IndexDB 是一个对象存储&#xff0c;数据是以 key:value 的形式进行存储和访问的&am…...

怎样的跨网软件,可以实现网间数据的安全收发?

网络隔离已是较为常见的网络安全保护措施&#xff0c;比如防火墙、网闸、VLAN&#xff0c;云桌面虚拟环境等方面进行隔离。像一些科技研发型企业&#xff0c;不仅仅是内外网隔离&#xff0c;甚至还划分办公网、研发网、测试网、生产网等&#xff0c;防止研发资料、设计资料等敏…...

Sora惊艳亮相:AI技术掀起创作革命,影视产业迎来新风貌!

Sora平台近期发布了名为"Sora首次印象"的更新&#xff0c;为用户带来了令人瞩目的变化。该更新不仅展示了Sora平台的发展方向&#xff0c;还介绍了其在电影制作、广告宣传等领域的潜在应用。 同时&#xff0c;Sora的首席执行官Sam Altman与好莱坞影视工作室进行了会…...

Mac电脑安装打开APP显示问题已损坏 问题解决

当MAC电脑安装完软件打开时&#xff0c;显示文件已损坏&#xff0c;无法打开。搜了很多教程终于找到解决方案&#xff0c;记录下方便以后再用。 我的mac电脑是intel芯片的&#xff0c;如果你遇到这个问题&#xff0c;可以参考我的这个方案。 1.首先当打开软件后出现 “xx软件已…...

AI 数据观 | TapData Cloud + MongoDB Atlas:大模型与 RAG 技术有机结合,落地实时工单处理智能化解决方案

本篇为「AI 数据观」系列文章第二弹&#xff0c;在这里&#xff0c;我们将进一步探讨 AI 行业的数据价值。以 RAG 的智能工单应用场景为例&#xff0c;共同探索如何使用 Tapdata Cloud MongoDB Atlas 实现具备实时更新能力的向量数据库&#xff0c;为企业工单处理的智能化和自…...

Vulnhub靶机随笔-Hacksudo_Aliens

Vulnhub靶机Hacksudo_Aliens详解 攻击机Kali IP:192.168.3.44 靶机 IP:未知 系统:未知 A.信息收集 扫描靶机存活性 确定IP地址 1.命令:arp-scan -l 扫描靶机开放端口及其服务版本信息 2.命令 nmap -A -p- -sV 靶机IP地址 靶机开放三个端口,22ssh端口,80web端…...

抖店选品都怎么选品?什么样的产品更吸引人,更具有购买力?

大家好&#xff0c;我是电商花花。 抖店选品一直都是我们无货源商家的核心问题&#xff0c;不管是出单、还是爆单&#xff0c;店铺想要有销量的前提下都是选品。 很多人一上来就是就是选品&#xff0c;没有选品经验还瞎选品&#xff0c;结果到最后选了一堆出单的产品&#xf…...

将来会是Python、Java、Golang三足鼎立吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 软件工程里没有银弹&#xff…...

Java入门基础学习笔记16——运算符

package cn.ensource.operator;public class OperatorDemo1 {public static void main(String[] args) {// 目标&#xff1a;掌握基本的算术运算符的使用int a 10;int b 2;System.out.println(a b);System.out.println(a - b);System.out.println(a * b); // 20System.out.…...

golang中三种线程安全的MAP

一、map 是什么 map 是 Go 中用于存储 key-value 关系数据的数据结构&#xff0c;类似 C 中的 map&#xff0c;Python 中的 dict。Go 中 map 的使用很简单&#xff0c;但是对于初学者&#xff0c;经常会犯两个错误&#xff1a;没有初始化&#xff0c;并发读写。 1、未初始化的…...

C++笔试强训day16

目录 1.字符串替换 2.神奇数 3.DNA序列 1.字符串替换 链接 简单的遍历替换即可&#xff1a; class Solution { public:string formatString(string str, vector<char>& arg) {string ret;int k 0;for (int i 0; i < str.size(); i){if (str[i] %){ret arg…...

spsr 的恢复出错,导致 thumb 指令集的 it 条件运行指令运行异常,清晰的调试思路帮助快速解决问题

记一次调试过程 这是一个在 arm 架构上的 RTOS 上的调试过程。问题现象为使用 thumb 指令集的 libgcc 库的情况下&#xff0c;浮点运算随机出错。经过一番追踪调试&#xff0c;逐步缩小问题范围&#xff0c;最后定位问题&#xff0c;成功解决。 场景 在某款的国产 RTOS 上&a…...

mysql binlog 如何区分db

binlog不是InnoDB存储引擎特有的日志文件&#xff0c;是属于mysql server自己的日志文件。 提交事务的时候&#xff0c;同时会写入binlog 在MySQL中&#xff0c;Binary Log&#xff08;binlog&#xff09;记录了数据库更改操作的所有细节&#xff0c;对于实现数据复制、恢复以…...

ESP32 IDF linux下开发环境搭建

文章目录 介绍升级Python环境下载Python包配置编译环境及安装Python设置环境变量 ESPIDF环境搭建下载esp-idf 代码编译等待下载烧录成功查看串口打印 介绍 esp32 官方文档给的不是特别详细 参考多方资料 最后才完成开发 主要问题在于github下载的很慢本教程适用于ubuntu deban…...

光伏电站智能管理平台功能全面介绍

一、介绍 光伏电站智能管理平台专门为了光伏电站服务的融合了项目沟通、在线设计、施工管理、运维工单等多智能光伏管理系统&#xff0c;可以满足光伏电站建设前期沟通、中期建设和后续维护的一体化智能平台&#xff0c;同时通过组织架构对企业员工进行线上管理和数据同步&…...

SSL证书 购买流程

在购买SSL证书之前&#xff0c;需要知道一点相关的知识&#xff0c;通常包括以下几个环节&#xff1a; 一、确定需求 1、根据需要保护的域名数量&#xff0c;在以下三类中选择合适的证书类型&#xff1a; 单域名证书&#xff0c;只对一个域名&#xff08;例如abc.com&#x…...

C++|二叉搜索树

一、二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根结…...

网页html版面分析-- BeauifulSoup(python 文档解析提取)

介绍 BeauifulSoup 是一个可以从HTML或XML 文件中提取数据的python库&#xff1b;它能通过转换器实现惯用的文档导航、查找、修改文档的方式。 BeauifulSoup是一个基于re开发的解析库&#xff0c;可以提供一些强大的解析功能&#xff1b;使用BeauifulSoup 能够提高提取数据的效…...

第五十八节 Java设计模式 - 适配器模式

Java设计模式 - 适配器模式 我们在现实生活中使用适配器很多。例如&#xff0c;我们使用存储卡适配器连接存储卡和计算机&#xff0c;因为计算机仅支持一种类型的存储卡&#xff0c;并且我们的卡与计算机不兼容。 适配器是两个不兼容实体之间的转换器。适配器模式是一种结构模…...

程序员的归宿。。

大家好&#xff0c;我是瑶琴呀。 相信每个进入职场的人都考虑过自己的职业生涯规划&#xff0c;在不同的年龄段可能面临不同挑战&#xff0c;这点对于 35 的人应该更为感同身受。 对于程序员来说&#xff0c;大部分人的职业道路主要是下面三种&#xff1a;第一条&#xff0c;…...

别再乱点JIRA后台了!手把手教你配置项目专属的创建/编辑界面(附避坑清单)

别再乱点JIRA后台了&#xff01;手把手教你配置项目专属的创建/编辑界面&#xff08;附避坑清单&#xff09; 当团队开始使用JIRA管理敏捷开发流程时&#xff0c;默认的界面配置往往成为效率杀手。开发人员创建Bug时被无关字段干扰&#xff0c;产品经理填写用户故事时找不到必填…...

使用 llama.cpp + MTP 分支实现 1.5 倍 Token 输出加速实战指南

使用 llama.cpp MTP 分支实现 1.5 倍 Token 输出加速实战指南 摘要&#xff1a;本文详细介绍如何通过 llama.cpp 的 MTP&#xff08;Multi-Token Prediction&#xff09;PR 分支&#xff0c;配合 Qwen3.6-27B-MTP GGUF 量化模型&#xff0c;实现推理时每秒输出 token 数量翻倍…...

构建毫秒级实时传输系统:基于flv.js的低延迟架构优化方案

构建毫秒级实时传输系统&#xff1a;基于flv.js的低延迟架构优化方案 【免费下载链接】flv.js HTML5 FLV Player 项目地址: https://gitcode.com/gh_mirrors/fl/flv.js flv.js作为HTML5 FLV播放器的核心技术方案&#xff0c;通过Media Source Extensions实现浏览器端FLV…...

从仿真结果到科研图表:手把手教你用Tonyplot处理Silvaco TCAD数据

从仿真结果到科研图表&#xff1a;手把手教你用Tonyplot处理Silvaco TCAD数据 在半导体器件研究中&#xff0c;TCAD仿真数据的可视化呈现往往决定着研究成果的传达效果。许多研究者花费大量时间完成Silvaco仿真后&#xff0c;却苦于无法将原始数据转化为符合学术出版要求的专业…...

Jellyfin.Plugin.MetaShark配置详解:10个关键设置优化你的元数据刮削体验

Jellyfin.Plugin.MetaShark配置详解&#xff1a;10个关键设置优化你的元数据刮削体验 【免费下载链接】jellyfin-plugin-metashark jellyfin电影元数据插件 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metashark 想要让你的Jellyfin媒体库拥有丰富的…...

npcpy:模块化AI智能体框架,从角色构建到团队协作的工程实践

1. 项目概述&#xff1a;一个为AI应用构建者准备的“瑞士军刀”如果你和我一样&#xff0c;在过去几年里尝试过用大语言模型&#xff08;LLM&#xff09;构建点什么东西&#xff0c;那你大概率经历过这样的循环&#xff1a;从LangChain、LlamaIndex这类框架开始&#xff0c;被它…...

PyTorch预训练模型‘解剖课’:以VGG19为例,彻底搞懂如何自定义输出层(避坑指南)

PyTorch预训练模型‘解剖课’&#xff1a;以VGG19为例&#xff0c;彻底搞懂如何自定义输出层&#xff08;避坑指南&#xff09; 当你第一次拿到一个预训练好的VGG19模型&#xff0c;兴奋地准备用它提取图像特征时&#xff0c;却发现自己被卡在了第一步——这个"黑箱"…...

MagiskBoot深度解析:Android启动镜像处理机制与实战应用

MagiskBoot深度解析&#xff1a;Android启动镜像处理机制与实战应用 【免费下载链接】Magisk The Magic Mask for Android 项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk MagiskBoot作为Magisk项目中的核心工具&#xff0c;专门负责Android启动镜像的解析、…...

3个核心机制解密:如何让视频PPT提取工具智能识别每一页幻灯片

3个核心机制解密&#xff1a;如何让视频PPT提取工具智能识别每一页幻灯片 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 你是否曾经面对长达数小时的会议录像&#xff0c;需要从中提…...

云原生地理空间分析引擎Meridian:基于Arrow与GeoParquet的高性能架构解析

1. 项目概述&#xff1a;一个面向未来的开源地理空间数据引擎最近在折腾一个涉及大量地理信息处理的项目&#xff0c;从海量GPS轨迹点到复杂的多边形区域分析&#xff0c;传统的数据库和工具链在处理效率和灵活性上开始捉襟见肘。就在这个当口&#xff0c;我注意到了GitHub上一…...