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

Vue 集成和使用 SQLite 的完整指东

1. 引言

SQLite 是一种轻量级的关系型数据库管理系统,以其简单易用、无需服务器等特点广泛应用于嵌入式系统、移动应用和小型应用程序中。在 Web 开发中,尤其是前端应用开发中,SQLite 可以作为客户端本地存储的一种选择,为用户提供离线数据存储和访问的能力。

在 Vue.js 项目中使用 SQLite,可以将应用的数据存储在客户端,这对于开发 PWA(渐进式 Web 应用)或需要在离线环境下运行的应用非常有用。本文将介绍如何在 Vue 项目中集成 SQLite,并通过实例讲解其实际应用。

2. 环境准备

在开始之前,我们需要确保开发环境已经配置好,并安装了必要的依赖。

2.1 Node.js 和 Vue CLI 安装

首先,你需要安装 Node.js 和 Vue CLI 以便创建 Vue 项目。你可以通过以下步骤安装这些工具:

  1. 下载并安装 Node.js,确保安装了最新的稳定版本。
  2. 安装 Vue CLI:
npm install -g @vue/cli

2.2 创建 Vue 项目

使用 Vue CLI 创建一个新的 Vue 项目:

vue create sqlite-vue-app

按照提示选择配置选项,这里选择默认配置即可。

2.3 安装 SQLite 依赖

要在 Vue 项目中使用 SQLite,我们可以借助一些库来简化操作,例如 sql.js 或者 node-sqlite3

  1. 安装 sql.js
npm install sql.js

sql.js 是 SQLite 的 JavaScript 实现,允许在浏览器中直接操作 SQLite 数据库。

  1. 如果你的应用需要运行在 Node.js 环境下(例如 Electron 应用),你可以使用 node-sqlite3
npm install sqlite3

3. SQLite 数据库操作

3.1 创建 SQLite 数据库

在 Vue 项目中,可以通过 sql.js 在浏览器内存中创建一个 SQLite 数据库:

import initSqlJs from 'sql.js';export default {data() {return {db: null,};},async created() {const SQL = await initSqlJs({ locateFile: filename => `https://sql.js.org/dist/${filename}` });this.db = new SQL.Database();},
};

上述代码中,我们通过 initSqlJs 初始化 SQLite,并在 Vue 组件中创建一个 SQLite 数据库实例。

3.2 执行 SQL 语句

一旦创建了数据库实例,就可以使用 SQL 语句来创建表、插入数据、查询数据等操作。例如,创建一个用户表并插入一些数据:

this.db.run(`CREATE TABLE users (id INTEGER PRIMARY KEY,name TEXT,email TEXT);
`);this.db.run(`INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
`);

3.3 查询数据

可以使用 SELECT 语句查询数据,并将结果显示在 Vue 组件中:

const results = this.db.exec("SELECT * FROM users;");
const users = results[0].values;
console.log(users);

4. 在 Vue 组件中展示 SQLite 数据

接下来,我们将学习如何在 Vue 组件中展示从 SQLite 数据库查询到的数据。

4.1 数据绑定和渲染

将查询到的用户数据绑定到 Vue 组件的数据模型中,并在模板中渲染:

data() {return {db: null,users: []};
},
async created() {const SQL = await initSqlJs({ locateFile: filename => `https://sql.js.org/dist/${filename}` });this.db = new SQL.Database();this.db.run(`CREATE TABLE users (id INTEGER PRIMARY KEY,name TEXT,email TEXT);`);this.db.run(`INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');`);const results = this.db.exec("SELECT * FROM users;");this.users = results[0].values;
}

在模板中使用 v-for 指令渲染用户数据:

<ul><li v-for="user in users" :key="user[0]">{{ user[1] }} - {{ user[2] }}</li>
</ul>

4.2 数据的增删改查

除了展示数据外,实际应用中我们通常还需要支持对数据的增删改查操作。以下是一个完整的示例,展示了如何在 Vue 组件中实现对 SQLite 数据的增删改查。

4.2.1 添加数据

可以通过表单输入用户信息,然后插入到 SQLite 数据库中:

<form @submit.prevent="addUser"><input v-model="newUser.name" placeholder="Name" /><input v-model="newUser.email" placeholder="Email" /><button type="submit">Add User</button>
</form>

methods 中实现 addUser 方法:

methods: {addUser() {this.db.run(`INSERT INTO users (name, email) VALUES ('${this.newUser.name}', '${this.newUser.email}');`);this.fetchUsers(); // 重新获取数据},fetchUsers() {const results = this.db.exec("SELECT * FROM users;");this.users = results[0].values;}
}
4.2.2 删除数据

在用户列表中添加删除按钮,并实现删除功能:

<ul><li v-for="user in users" :key="user[0]">{{ user[1] }} - {{ user[2] }}<button @click="deleteUser(user[0])">Delete</button></li>
</ul>

methods 中实现 deleteUser 方法:

methods: {deleteUser(id) {this.db.run(`DELETE FROM users WHERE id = ${id};`);this.fetchUsers(); // 重新获取数据}
}
4.2.3 更新数据

更新数据通常需要弹出一个编辑表单,用户可以修改数据并提交更改。下面是实现更新功能的代码示例:

<ul><li v-for="user in users" :key="user[0]">{{ user[1] }} - {{ user[2] }}<button @click="editUser(user)">Edit</button></li>
</ul><div v-if="editingUser"><h3>Edit User</h3><form @submit.prevent="updateUser"><input v-model="editingUser.name" /><input v-model="editingUser.email" /><button type="submit">Update</button></form>
</div>

methods 中实现 editUserupdateUser 方法:

data() {return {editingUser: null};
},
methods: {editUser(user) {this.editingUser = { ...user };},updateUser() {this.db.run(`UPDATE users SET name = '${this.editingUser.name}', email = '${this.editingUser.email}' WHERE id = ${this.editingUser.id};`);this.editingUser = null;this.fetchUsers(); // 重新获取数据}
}

5. 将 SQLite 数据库持久化

在浏览器环境中,SQLite 数据库默认是存储在内存中的,这意味着刷新页面后数据将丢失。如果希望数据持久化存储,可以将数据库导出为文件,并在需要时加载。

5.1 导出数据库

可以使用 sql.js 提供的 export 方法将数据库导出为二进制文件,并使用 FileSaver 库保存到本地:

npm install file-saver

在 Vue 组件中实现导出功能:

import { saveAs } from 'file-saver';methods: {exportDB() {const data = this.db.export();const blob = new Blob([data], { type: 'application/octet-stream' });saveAs(blob, 'database.sqlite');}
}

5.2 加载数据库

加载持久化的数据库文件可以通过 sql.jsDatabase 方法实现:

async loadDB(file) {const data = await file.arrayBuffer();this.db = new SQL.Database(new Uint8Array(data));this.fetchUsers(); // 加载数据
}

在模板中添加文件输入,用于选择数据库文件:

<input type="file" @change="loadDB($event.target.files[0])" />

6. 使用 SQLite 进行高级操作

在实际应用中,除了基本的增删改查操作,我们可能还需要进行更复杂的数据库操作,如事务处理、索引管理、多表查询等。SQLite 作为一个完整的关系型数据库管理系统,提供了丰富的功能支持。

6.1 事务处理

事务处理用于确保一组数据库操作要么全部成功,要么全部回滚。可以使用 BEGIN TRANSACTIONCOMMIT 来实现事务处理:

this.db.run("BEGIN TRANSACTION;");
try {this.db.run("INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com');");this.db.run("INSERT INTO orders (user_id, product) VALUES (1, 'Laptop');");this.db.run("COMMIT;");
} catch (e) {this.db.run("ROLLBACK;");console.error("Transaction failed: ", e);
}

6.2 索引管理

为了提高查询性能,可以在常用的查询字段上创建索引:

this.db.run("CREATE INDEX idx_users_name ON users(name);");

6.3 多表查询

在 SQLite 中,可以使用 SQL 的 JOIN 语法进行多表查询。例如,查询用户及其订单信息:

const results = this.db.exec(`SELECT users.name, orders.product FROM users JOIN orders ON users.id = orders.user_id;
`);
const userOrders = results[0].values;
console.log(userOrders);

7. 结论

在 Vue 项目中使用 SQLite 数据库为应用提供了强大的本地数据存储能力,特别适用于离线应用和轻量级数据管理场景。本文介绍了在 Vue 项目中集成 SQLite 的全过程,从环境准备、数据库操作、数据展示,到高级操作的实现。

通过这种方式,我们可以在前端应用中实现复杂的数据库操作,并为用户提供更好的数据存储和管理体验。希望本文能够为你在 Vue 项目中使用 SQLite 提供参考和帮助。

相关文章:

Vue 集成和使用 SQLite 的完整指东

1. 引言 SQLite 是一种轻量级的关系型数据库管理系统&#xff0c;以其简单易用、无需服务器等特点广泛应用于嵌入式系统、移动应用和小型应用程序中。在 Web 开发中&#xff0c;尤其是前端应用开发中&#xff0c;SQLite 可以作为客户端本地存储的一种选择&#xff0c;为用户提…...

【JVM什么时候触发YoungGC和FullGC】

YoungGC 年轻代Eden区满&#xff0c;就会触发YoungGC FullGC 老年代空间不足 经过多次GC后的大年龄对象会被放进老年代&#xff0c;或创建的大对象会直接在老年代分配&#xff0c;此时若老年代空间不足&#xff0c;就会触发FullGC。空间分配担保失败 触发YoungGC的时候会进行…...

ubuntu配置网络

1&#xff0c;设置桥接模式 1-1&#xff1a; 确定。 1-2&#xff1a; 编辑--->虚拟网络编辑器 刚安装ubuntu的时候&#xff0c;可能没有任何VMnet. 更改设置的目的&#xff1a; 添加VMnet0&#xff0c;并且设置VMnet为桥接模式--自动桥接。 如果没有VMnet0,选择添加网络…...

第十一课 Unity编辑器创建的资源优化_预制体和材质篇(Prefabs和Materials)详解

预制体(Prefabs) Unity中的预制体是用来存储游戏对象、子对象及其所需组件的可重用资源&#xff0c;一般来说预制体资源可充当资源模版&#xff0c;在此模版基础上可以在场景中创建新的预制体实例。 使用预制体的好处 由于预制体系统可以自动保持所有实例副本同步&#xff0c…...

2024.11.29(单链表)

思维导图 声明文件 #ifndef __LINKLIST_H__ #define __LINKLIST_H__#include <myhead.h>typedef char datatype; //数据元素类型 //定义节点类型 typedef struct Node {union{int len; //头节点数据域datatype data; //普通节点数据域};struct Node *next; //指针域…...

基于深度学习和卷积神经网络的乳腺癌影像自动化诊断系统(PyQt5界面+数据集+训练代码)

乳腺癌是全球女性中最常见的恶性肿瘤之一&#xff0c;早期准确诊断对于提高生存率具有至关重要的意义。传统的乳腺癌诊断方法依赖于放射科医生的经验&#xff0c;然而&#xff0c;由于影像分析的复杂性和人类判断的局限性&#xff0c;准确率和一致性仍存在挑战。近年来&#xf…...

opengl 三角形

最后效果&#xff1a; OpenGL version: 4.1 Metal 不知道为啥必须使用VAO 才行。 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <vector>void framebuffer_size_callback(GLFWwindow *window, int width, int heigh…...

23种设计模式-抽象工厂(Abstract Factory)设计模式

文章目录 一.什么是抽象工厂设计模式&#xff1f;二.抽象工厂模式的特点三.抽象工厂模式的结构四.抽象工厂模式的优缺点五.抽象工厂模式的 C 实现六.抽象工厂模式的 Java 实现七.代码解析八.总结 类图&#xff1a; 抽象工厂设计模式类图 一.什么是抽象工厂设计模式&#xff1f…...

手机上怎么拍证件照,操作简单且尺寸颜色标准的方法

在数字化时代&#xff0c;手机已成为我们日常生活中不可或缺的一部分。它不仅是通讯工具&#xff0c;更是我们拍摄证件照的便捷利器。然而&#xff0c;目前证件照制作工具鱼龙混杂&#xff0c;很多打着免费名号的拍照软件背后却存在着泄漏用户信息、照片制作不规范导致无法使用…...

IDEA报错: java: JPS incremental annotation processing is disabled 解决

起因 换了个电脑打开了之前某个老项目IDEA启动springcloud其中某个服务直接报错&#xff0c;信息如下 java: JPS incremental annotation processing is disabled. Compilation results on partial recompilation may be inaccurate. Use build process “jps.track.ap.depen…...

OCR实现微信截图改名

pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple/ ──(Sat,Nov30)─┘ pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install paddleo…...

第一届“吾杯”网络安全技能大赛 Writeup

战队信息 战队名称&#xff1a;在你眼中我是誰&#xff0c;你想我代替誰&#xff1f; 战队排名&#xff1a;13 Misc Sign Hex 转 Str&#xff0c;即可得到flag。 原神启动&#xff01; 不好评价&#xff0c;stegsolve 秒了&#xff1a; WuCup{7c16e21c-31c2-439e-a814-b…...

再谈Java中的String类型是否相同的判断方法

目录 第一部分 代码展示 画图展示 第二部分 代码展示 画图展示 第一部分 代码展示 画图展示 第二部分 代码展示 画图展示...

<一>51单片机环境

目录 1,51单片机开发语言是C,环境keil 1.1,工程创建 1.2用什么把代码放进单片机里面 2,初识代码 1,51单片机开发语言是C,环境keil 1.1,工程创建 1. 创建项目工程文件夹&#xff0c;可以当作模板Template 2. 创建文件&#xff0c;取名main.c 3,编译&#xff0c;选择输出文…...

【0x0001】HCI_Set_Event_Mask详解

目录 一、命令概述 二、命令格式 三、命令参数说明 四、返回参数说明 五、命令执行流程 5.1. 主机准备阶段 5.2. 命令发送阶段 5.3. 控制器接收与处理阶段 5.4. 事件过滤与反馈阶段 5.5. 主机处理&#xff08;主机端&#xff09; 5.6. 示例代码 六、命令应用场景 …...

第三方Express 路由和路由中间件

文章目录 1、Express 应用使用回调函数的参数&#xff1a; request 和 response 对象来处理请求和响应的数据。2、Express路由1.路由方法2.路由路径3.路由处理程序 3. 模块化路由4. Express中间件1.中间件简介2.中间件分类3.自定义中间件 1、Express 应用使用回调函数的参数&am…...

七、Python —— 元组、集合和字典

文章目录 一、元组1.1、元组的初始化1.2、元组的解包1.3、元组的比较运算1.4、元组的其他操作 二、集合 set2.1、集合的初始化2.2、集合的常用操作2.3、使用 for 循环遍历集合 三、字典 map3.1、字典的初始化3.2、字典的常用操作3.3、使用 for 循环遍历字典 四、补充 一、元组 …...

Aes加解密

加解密概念 加密AES加密填充模式加密模式示例 加密 通过一系列计算将明文转换成一个密文。 加密和解密的对象通常是字节数组&#xff08;有的语言动态数组类比切片&#xff09; 加密后的数据&#xff0c;可能有很多是不可读字符。通常会将其转换为可见的字符串。 直接将字节…...

【时时三省】Tessy 故障入侵 使用教程

目录 1,故障入侵 介绍 故障入侵适用场景: 打故障入侵的方法和选项介绍: 2,打单个函数的故障入侵 3,打整体用例的故障入侵 4,一个函数打多个故障入侵 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,故障入侵 介绍 故障入侵适用场景: 故障入侵 …...

.NET 9 AOT的突破 - 支持老旧Win7与XP环境

引言 随着技术的不断进步&#xff0c;微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中&#xff0c;一个特别引人注目的亮点是 AOT&#xff08; Ahead-of-Time&#xff09;支持&#xff0c;它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...