Electron实现“仅首次运行时创建SQLite数据库”

在桌面应用中,SQLite因其轻量、嵌入式特性成为本地存储的热门选择。但若重复初始化数据库,会导致数据覆盖或冗余。本文将详解如何让Electron应用仅在首次启动时创建SQLite数据库,后续启动直接连接现有库。


一、核心逻辑与实现原理

核心思路:通过检测数据库文件是否存在,决定是否执行建表操作。
关键技术点

  1. 路径管理:使用Electron的app.getPath('userData')获取用户数据目录,确保数据库文件持久化存储。
  2. 文件存在性检查:通过Node.js的fs.existsSync()判断数据库文件是否已创建。
  3. 条件化初始化:仅当文件不存在时,执行建表SQL语句。

二、分步实现代码

以下以主进程(main.js)为例,整合sqlite3path模块:

const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');
const fs = require('fs');
const sqlite3 = require('sqlite3').verbose();function createWindow() {// 窗口创建逻辑
}app.whenReady().then(() => {// 定义数据库路径(用户数据目录下)const userDataPath = app.getPath('userData');const dbPath = path.join(userDataPath, 'app_database.db');// 关键逻辑:仅在文件不存在时初始化数据库if (!fs.existsSync(dbPath)) {const db = new sqlite3.Database(dbPath, (err) => {if (err) console.error('Database creation failed:', err);else {// 执行建表语句db.run(`CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,email TEXT UNIQUE)`, (err) => {if (err) console.error('Table creation error:', err);else console.log('Database & tables initialized!');});}});} else {console.log('Existing database connected.');}createWindow();
});

三、关键优化与注意事项
  1. 避免重复初始化
    • 使用CREATE TABLE IF NOT EXISTS代替CREATE TABLE,防止后续运行时误删表。
  2. 异步安全
    • 数据库操作需封装在app.whenReady()内,确保Electron初始化完成后再访问文件系统。
  3. 路径动态生成
    • 开发环境与生产环境的路径差异需通过app.isPackaged区分。
  4. 错误处理
    • 封装Promise或try/catch捕获文件操作及SQL执行异常。

四、进阶场景:封装为可复用模块

将数据库逻辑独立为database.js模块:

// database.js
const initDatabase = () => {const dbPath = path.join(app.getPath('userData'), 'app.db');if (!fs.existsSync(dbPath)) {const db = new sqlite3.Database(dbPath);db.exec(`CREATE TABLE settings (key TEXT PRIMARY KEY, value TEXT);INSERT INTO settings (key, value) VALUES ('first_run', 'true');`);return db;}return new sqlite3.Database(dbPath); // 返回现有连接
};module.exports = { initDatabase };

主进程中调用:

const { initDatabase } = require('./database');
app.whenReady().then(() => {const db = initDatabase();// 其他逻辑
});

五、常见问题排查
问题解决方案
安装sqlite3编译失败添加electron-rebuild并指定target版本
打包后数据库文件未生成package.json中配置extraResources拷贝初始文件
渲染进程无法访问数据库通过ipcMain暴露接口,禁止直接跨进程操作

六、替代方案对比
方案适用场景缺点
SQLite需复杂查询、事务支持需处理原生模块编译
JSON文件存储简单键值对、低数据量性能差,无SQL能力
Browser IndexedDB纯前端存储,无Node依赖容量限制,无复杂查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89153.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里开源AI大模型ThinkSound如何为视频配上灵魂之声

目录 前言 一、当AI解决视频配音的困境 二、引入“思维链”:让AI像专业音效师一样思考 三、背后的技术支撑 四、未来ThinkSound会如何改变我们的世界? 总结 🎬 攻城狮7号:个人主页 🔥 个人专栏:《AI前沿技术要闻…

图论(1):多叉树

多叉树一、基础知识1. 图 & 树2. 模板2.1 建图二、简单循环1. 【模板】树的路径求和2. 道路修建(改)3. 联合权值4. 毛毛虫树三、自顶向下/自底向上1. 医疗中心2. 【模板】树的直径3. 【模板】最大子树和4. 信号放大器一、基础知识 1. 图 & 树 …

楼宇自动化:Modbus 在暖通空调(HVAC)中的节能控制(一)

引言**在当今的建筑领域,楼宇自动化正扮演着愈发关键的角色,它致力于提升建筑的舒适度、安全性以及能源效率。而暖通空调(HVAC)系统作为楼宇自动化中的核心部分,其能耗在整个建筑能耗中占比相当高,据相关数…

【SpringBoot】注册条件+自动配置原理+自定义starter

注册条件注入到容器内实体类型对象的属性都是null,这些对象并没有什么实际的意义,因为实体类的对象就是来封装对象的,结果你这些对象中什么都没有;解决方法是1.给这些属性赋值然后再注入bean但是这些属性又是固定的不是很好&#…

Server reports Content-Length Mismatch 的根源与解决方案

“服务器声明604字节,Yum却期待28680字节”——当包管理器与仓库服务器之间的信任崩塌时,会发生什么?问题重现 yum install package_name ... Interrupted by header callback: Server reports Content-Length: 604 but expected size is: 28…

基于 Python/PHP/Node.js 的淘宝 API 商品数据抓取开发教程

在电商数据分析、竞品监控等场景中,抓取淘宝商品数据是常见需求。淘宝开放平台(Open Platform)提供了标准化的 API 接口,通过合法途径调用可高效获取商品信息。本文将分别基于 Python、PHP、Node.js 三种语言,详解淘宝…

【Tensor的创建】——深度学习.Torch框架

目录 1 Tensor概述 2 Tensor的创建 2.1 基本的创建方式 2.1.1 torch.tensor 2.1.2 torch.Tensor 2.2 创建线性和随机张量 2.2.1 创建线性张量 2.2.2 随机张量 1 Tensor概述 PyTorch会将数据封装成张量(Tensor)进行计算,张量就是元素为…

Python脚本批量修复文件时间戳,根据文件名或拍摄日期

实现以下功能 更正文件的 修改时间批量修改指定文件夹中的特定后缀的文件根据文件名中的日期修改(优先)根据 jpg 文件属性中的拍摄日期修改根据 mp4 文件属性中的创建媒体日期修改模拟运行(Dry Run)模式 依赖 若需要基于jpg文件属…

[Mysql] Connector / C++ 使用

一、Connector / C 使用 要使用 C 语言连接 MySQL,需要使用 MySQL 官网提供的库,可以去官网进行下载:MySQL :: MySQL Community Downloads 我们使用 C 接口库来进行连接,要正确使用,还需要做一些准备工作&#xff1a…

【PDF识别改名】使用京东云OCR完成PDF图片识别改名,根据PDF图片内容批量改名详细步骤和解决方案

京东云OCR识别PDF图片并批量改名解决方案一、应用场景在日常办公和文档管理中,经常会遇到大量 PDF 文件需要根据内容进行分类和命名的情况。例如:企业合同管理系统需要根据合同编号、日期等内容自动命名 PDF 文件图书馆数字化项目需要将扫描的图书章节按…

stm32-modbus-rs485程序移植过程

背景 【modbus学习笔记】Modbus协议解析_modus协议中0.001如何解析-CSDN博客 【Modbus学习笔记】stm32实现Modbus(从机)并移植_stm32 modbus数据处理-CSDN博客 继上篇成功移植modbus从机例程之后,我要尝试移植主机的程序。经提醒,可用野火的modbus代码…

Spring MVC 执行流程详解:一次请求经历了什么?

Spring MVC 执行流程详解:一次请求经历了什么? 引言 在现代 Web 开发中,Spring MVC 作为 Spring 框架的重要组成部分,广泛应用于构建灵活、可扩展的 Java Web 应用。作为一个基于 MVC(Model-View-Controller&#xff0…

Vue 3的核心机制-解析事件流、DOM更新、数据请求、DOM操作规范及组件库DOM操作的解决方案

文章目录概要整体介绍vue 中dom操作推荐方案实例概要 从Vue 3的核心机制出发,结合场景、应用与实例,系统化解析事件流、DOM更新、数据请求、DOM操作规范及组件库DOM操作的解决方案: 整体介绍 ⚡️ 一、事件流处理机制 核心机制 • 三个阶段…

Python从入门到高手9.2节-Python字典的操作方法

目录 9.2.1 字典的操作 9.2.2 字典的查找 9.2.3 字典的修改 9.2.4 字典的添加 9.2.5 字典的删除 9.2.6 今天你逛街了吗 9.2.1 字典的操作 字典类型是一种抽象数据类型,抽象数据类型定义了数据类型的操作方法,在本节的内容中,教同学们彻…

omniparser v2 本地部署及制作docker镜像(20250715)

关于 omniparser v2 本地部署,网上资料不算多,尤其是对于土蔷内用户,还是有些坑的。 1、安装步骤 可参考两个CSDN博客: (1)大模型实战 - ‘OmniParser-V2本地部署安装 链接 (2)…

自己写个 `rsync` + `fswatch` 实时增量同步脚本,干掉 Cursor AI、Sublime Text 的SFTP等 插件!

自己写个 rsync fswatch 实时增量同步脚本,干掉 Cursor AI、Sublime Text 的 SFTP等 插件! 作为一个码农,我最头疼的事情之一就是编辑器同步代码到服务器这块。用过各种各样的sftp、rsync插件,感觉不好用。。 我琢磨着&#xff1…

linux中at命令的常用用法。

Linux 中 at 命令用于安排一次性定时任务,需要用到在某个时间只需要执行一次的命令的时候,可以使用at 1:安装at # Debian/Ubuntu sudo apt install at# CentOS/RHEL sudo yum install at2:启动at sudo systemctl start atd # 启…

【安卓笔记】RxJava的使用+修改功能+搭配retrofit+RxView防快速点击

0. 环境: 电脑:Windows10 Android Studio: 2024.3.2 编程语言: Java Gradle version:8.11.1 Compile Sdk Version:35 Java 版本:Java11 1. 介绍RxJava GitHub开源地址:https://github.com/Reactive…

Windows 下原生使用 claude code + Kimi K2

搞定了kimi k2 claude code在windows下原生使用 Windows下使用claude code的障碍是shell环境(命令行),非posix风格shell无法正常让claude code读取到url和key, 导致无法使用。解决问题的本质是使用符合posix风格的shell环境,我们…

Leetcode Easy题小解(C++语言描述)1

Leetcode Easy题小解(C语言描述) 相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交**:**题目数据…