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 项目。你可以通过以下步骤安装这些工具:
- 下载并安装 Node.js,确保安装了最新的稳定版本。
- 安装 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
。
- 安装
sql.js
:
npm install sql.js
sql.js
是 SQLite 的 JavaScript 实现,允许在浏览器中直接操作 SQLite 数据库。
- 如果你的应用需要运行在 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
中实现 editUser
和 updateUser
方法:
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.js
的 Database
方法实现:
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 TRANSACTION
和 COMMIT
来实现事务处理:
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 是一种轻量级的关系型数据库管理系统,以其简单易用、无需服务器等特点广泛应用于嵌入式系统、移动应用和小型应用程序中。在 Web 开发中,尤其是前端应用开发中,SQLite 可以作为客户端本地存储的一种选择,为用户提…...
【JVM什么时候触发YoungGC和FullGC】
YoungGC 年轻代Eden区满,就会触发YoungGC FullGC 老年代空间不足 经过多次GC后的大年龄对象会被放进老年代,或创建的大对象会直接在老年代分配,此时若老年代空间不足,就会触发FullGC。空间分配担保失败 触发YoungGC的时候会进行…...
ubuntu配置网络
1,设置桥接模式 1-1: 确定。 1-2: 编辑--->虚拟网络编辑器 刚安装ubuntu的时候,可能没有任何VMnet. 更改设置的目的: 添加VMnet0,并且设置VMnet为桥接模式--自动桥接。 如果没有VMnet0,选择添加网络…...
第十一课 Unity编辑器创建的资源优化_预制体和材质篇(Prefabs和Materials)详解
预制体(Prefabs) Unity中的预制体是用来存储游戏对象、子对象及其所需组件的可重用资源,一般来说预制体资源可充当资源模版,在此模版基础上可以在场景中创建新的预制体实例。 使用预制体的好处 由于预制体系统可以自动保持所有实例副本同步,…...
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界面+数据集+训练代码)
乳腺癌是全球女性中最常见的恶性肿瘤之一,早期准确诊断对于提高生存率具有至关重要的意义。传统的乳腺癌诊断方法依赖于放射科医生的经验,然而,由于影像分析的复杂性和人类判断的局限性,准确率和一致性仍存在挑战。近年来…...
opengl 三角形
最后效果: 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)设计模式
文章目录 一.什么是抽象工厂设计模式?二.抽象工厂模式的特点三.抽象工厂模式的结构四.抽象工厂模式的优缺点五.抽象工厂模式的 C 实现六.抽象工厂模式的 Java 实现七.代码解析八.总结 类图: 抽象工厂设计模式类图 一.什么是抽象工厂设计模式?…...
手机上怎么拍证件照,操作简单且尺寸颜色标准的方法
在数字化时代,手机已成为我们日常生活中不可或缺的一部分。它不仅是通讯工具,更是我们拍摄证件照的便捷利器。然而,目前证件照制作工具鱼龙混杂,很多打着免费名号的拍照软件背后却存在着泄漏用户信息、照片制作不规范导致无法使用…...
IDEA报错: java: JPS incremental annotation processing is disabled 解决
起因 换了个电脑打开了之前某个老项目IDEA启动springcloud其中某个服务直接报错,信息如下 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
战队信息 战队名称:在你眼中我是誰,你想我代替誰? 战队排名:13 Misc Sign Hex 转 Str,即可得到flag。 原神启动! 不好评价,stegsolve 秒了: 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. 创建项目工程文件夹,可以当作模板Template 2. 创建文件,取名main.c 3,编译,选择输出文…...
【0x0001】HCI_Set_Event_Mask详解
目录 一、命令概述 二、命令格式 三、命令参数说明 四、返回参数说明 五、命令执行流程 5.1. 主机准备阶段 5.2. 命令发送阶段 5.3. 控制器接收与处理阶段 5.4. 事件过滤与反馈阶段 5.5. 主机处理(主机端) 5.6. 示例代码 六、命令应用场景 …...
第三方Express 路由和路由中间件
文章目录 1、Express 应用使用回调函数的参数: 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加密填充模式加密模式示例 加密 通过一系列计算将明文转换成一个密文。 加密和解密的对象通常是字节数组(有的语言动态数组类比切片) 加密后的数据,可能有很多是不可读字符。通常会将其转换为可见的字符串。 直接将字节…...
【时时三省】Tessy 故障入侵 使用教程
目录 1,故障入侵 介绍 故障入侵适用场景: 打故障入侵的方法和选项介绍: 2,打单个函数的故障入侵 3,打整体用例的故障入侵 4,一个函数打多个故障入侵 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,故障入侵 介绍 故障入侵适用场景: 故障入侵 …...
.NET 9 AOT的突破 - 支持老旧Win7与XP环境
引言 随着技术的不断进步,微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中,一个特别引人注目的亮点是 AOT( Ahead-of-Time)支持,它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…...
CondaValueError: Malformed version string ‘~‘: invalid character(s).
问题描述:在window下使用conda安装任何包都会报错。报错信息是CondaValueError: Malformed version string ~: invalid character(s). 解决办法:把.condarc文件的源地址删除(八成是源地址访问不了了),只保存默认的&am…...
01-Ubuntu24.04LTS上安装PGSQL
目录 一、准备工作 1.1、系统要求 1.2 、更新 Ubuntu 系统 1.3 、安装依赖 1.4 、添加 PostgreSQL 16 软件源 二、安装 PostgreSQL 16 数据库 三、管理 PostgreSQL 服务 四、PostgreSQL 管理操作 4.1 、访问 Postgres 超级用户账户 4.2 、创建数据库并设置管理权限 4…...
Esp32使用micropython基于espnow实现语音对讲机
ESP-NOW协议介绍 ESP-NOW 是乐鑫自主研发的无连接通信协议,具有短数据包传输功能。该协议使多个设备能够以简单的方式相互通信。ESP-NOW 支持以下功能: 加密和未加密的单播通信; 混合加密和未加密的对等设备; 最多可携带 250 字节 的有效载荷; 发送回调功能,可以设置用于…...
Docker 容器隔离关键技术:SELinux
Docker 容器隔离关键技术:SELinux SELinux(Security-Enhanced Linux) 是 Linux 内核中的一项安全机制,用于实现强制访问控制(MAC)。Docker 利用了 SELinux 来增强容器的隔离性,通过对文件、进程…...
Java并发07之ThreadLocal
文章目录 1 ThreadLocal原理2 内部结构3 内存泄露问题4 entry的key为什么被设计为弱引用 1 ThreadLocal原理 ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private st…...
【单细胞数据库】癌症单细胞数据库CancerSEA
数据库地址:home (hrbmu.edu.cn) Cite Huating Yuan, Min Yan, Guanxiong Zhang, Wei Liu, Chunyu Deng, Gaoming Liao, Liwen Xu, Tao Luo, Haoteng Yan, Zhilin Long, Aiai Shi, Tingting Zhao, Yun Xiao, Xia Li, CancerSEA: a cancer single-cell state atlas…...
Rsa加解密 + 签名验签
Rsa加解密 概述聚合算法名称(用于创建加密器)基本概念填充方式分块加密 基本使用生成密钥加解密创建加密器设置模式(加密)、公钥对明文加密,并对结果进行Base64编码对以上结果,进行解密 设置模式࿰…...
bugku-web-留言板1
大小写绕过也不行 <ScRipt>ALeRt(“XSS”);</sCRipT> 双写绕过可以 <scscriptript>alert(z)</scscriptript> 改变大小写 在测试过程中,我们可以改变测试语句的大小写来绕过XSS规则: 比如:<script>alert(“xs…...
进程状态的学习
进程状态就是 task_struct 内的一个整数 状态间是可以进行转化的 运行: 每一个框都是进程的task_struct,都有唯一的pcb和pid来标识它的唯一性 让CPU选择一个进程去运行,本质是选择一个进程的PCB去运行,task_struct里一定有内存指…...
Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势)
Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势) Composition API 的优势1. Options API 存在的问题2. Composition API 的优势 Composition API 的优势 1. Options API 存在的问题 笔记 使用传统OptionsA…...
wordpress降级/百度快照入口官网
1.使类和成员的可访问性最小化 封装(数据私有化,方法公开化)/对外提供可调用的,稳定的功能可访问性应该明确修饰符本类同包类子类其他类public√√√√protected√√√默认√√private√实例域绝不能是公有的包级私有的…...
网站建设及优化 赣icp/免费网站的平台
修改接收端的WCF config文件,注意,如果server端接收request超长,则修改server端config,如果是client 接收response超长,则修改client端,建议两边都修改,保持一致 <bindings> <wsHttpBinding> <binding name"…...
网站建设的好处有什么用/引擎seo如何优化
系统流程如下图所示 首先数据交换流程为数据库<—>后台<---->前台 Dao层负责和数据库进行数据交互,services负责事务逻辑处理,action为struts部分,主要负责页面跳转时的数据传送。在web.xml文件中,有 <?xml version"1…...
中上网站建设/网络宣传平台有哪些
2017-04-06 回答python编程下,检查ip是否能ping通,并且分别导入两个文件,代码如下:#!/usr/bin/python#-*- coding:gb18030 -*-created on 2015-7-7#判断文件中的ip是否能ping通,并且将通与不通的ip分别写到两个文件中#…...
做外贸没有网站需要什么条件/外链工厂
><!-- 声明改变request的拦截器 --> <mvc:interceptors><mvc:interceptor><!-- 声明request的拦截器拦截的url --> <mvc:mapping path"/origin/**/*"/><!-- 声明改变request的拦截器不拦截的url --> <mvc:exclude-mapping…...
湖州建设局投标网站/国外网站seo
从乙方到甲方,我在做什么 最近,总有朋友在问,从一座熟悉的城市到陌生的环境,从乙方到甲方,这个转换挺大的,会不会有挫败感,你平时工作内容主要是哪些? 答:还好吧&#…...