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
英文地址,請注明出處:http://en.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 開始相交**:**題目數據…