【uniapp】uniapp中本地存储sqlite数据库保姆级使用教程(附完整代码和注释)

数据库请求接口封装

uniapp中提供了plus.sqlite接口,在这里我们对常用的数据库请求操作进行了二次封装
这里的dbNamedbPathrecordsTable 可以根据你的需求自己命名

module.exports = {
	/** 
	 * @type {String} 数据库名称
	 */
	dbName: 'salary',
	/**
	 * 数据库地址
	 * @type {String} 推荐以下划线为开头   _doc/xxx.db
	 * @description 开发环境中数据库所在地址:文件管理/Android/data/io.dcloud.HBuilder/downloads/salary.db
	 * @description 打包安装后数据库所在地址:文件管理/Android/data/uni.UNI4312312(以UNI开头接数字)/downloads/salary.db
	 */
	dbPath: '_downloads/salary.db',
	/**
	 * 加班记录表名
	 * @description
	 * "time" DATE  PRIMARY KEY,"money" INTEGER,"notes" text,"info" text
	 */
	recordsTable: 'records',

	/**
	 * 判断数据库是否打开
	 * @returns {Boolean} 打开为 true,未打开为 false
	 */
	isOpen() {
		var open = plus.sqlite.isOpenDatabase({
			name: this.dbName,
			path: this.dbPath
		})
		return open;
	},

	/**
	 * 打开数据库,没有则创建
	 */
	openSqlite() {
		return new Promise((resolve, reject) => {
			plus.sqlite.openDatabase({
				name: this.dbName,
				path: this.dbPath,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	},

	/**
	 * 关闭数据库
	 */
	closeSqlite() {
		return new Promise((resolve, reject) => {
			plus.sqlite.closeDatabase({
				name: this.dbName,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	},

	/**
	 * 数据库建表 sql:'CREATE TABLE IF NOT EXISTS dbTable("id" varchar(50),"name" TEXT) 
	 * 创建 CREATE TABLE IF NOT EXISTS 、 dbTable 是表名,不能用数字开头、括号里是表格的表头
	 * @param {Object} dbTable 表名
	 * @param {Object} data 表列
	 * @example 创建表 DB.createTable(表名, 表的列)
	 * let sql = '"date" DATE  PRIMARY KEY,"money" INTEGER,"notes" text,"info" text';
	 * await DB.createTable('records', sql);
	 */
	createTable(dbTable, data) {
		return new Promise((resolve, reject) => {
			// executeSql: 执行增删改等操作的SQL语句
			plus.sqlite.executeSql({
				name: this.dbName,
				sql: `CREATE TABLE IF NOT EXISTS ${dbTable}(${data})`,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	},

	/**
	 * 数据库删表
	 * @param {Object} dbTable 表名
	 * @description 数据库删表 sql:'DROP TABLE dbTable'
	 */
	dropTable(dbTable) {
		return new Promise((resolve, reject) => {
			plus.sqlite.executeSql({
				name: this.dbName,
				sql: `DROP TABLE ${dbTable}`,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	},

	// 向表格里添加数据 sql:'INSERT INTO dbTable VALUES('x','x','x')'			对应新增
	// 或者 sql:'INSERT INTO dbTable ('x','x','x') VALUES('x','x','x')'	具体新增
	/**
	 * 向表格里添加数据
	 * @param {String} dbTable 表名
	 * @param {String} data 列值
	 * @param {String} condition 表头列名
	 * @example  
	 * let sql = `'${item.money}','${item.notes}','${item.time}'`;
	 * let condition = "'money','notes','time'";
	 * await DB.insertTableData("records", sql, condition);
	 */
	insertTableData(dbTable, data, condition) {
		// 判断有没有传参
		if (dbTable !== undefined && data !== undefined) {
			// 判断传的参是否有值
			var bol = (JSON.stringify(data) == "{}");
			if (!bol) {
				if (condition == undefined) {
					var sql = `INSERT INTO ${dbTable} VALUES('${data}')`;
				} else {
					var sql = `INSERT INTO ${dbTable} (${condition}) VALUES(${data})`;
				}
				// console.log(sql);
				return new Promise((resolve, reject) => {
					// 表格添加数据
					plus.sqlite.executeSql({
						name: this.dbName,
						sql: sql,
						success(e) {
							resolve(e);
						},
						fail(e) {
							reject(e);
						}
					})
				})
			} else {
				return new Promise((resolve, reject) => {
					reject("错误添加")
				})
			}
		} else {
			return new Promise((resolve, reject) => {
				reject("错误添加")
			})
		}
	},

	/**
	 * 根据条件向表格里添加数据  有数据更新、无数据插入
	 * (建表时需要设置主键) 例如 --- "roomid" varchar(50) PRIMARY KEY
	 * @param {String} dbTable 表名
	 * @param {String} data 列值
	 * @param {String} condition 表头列名
	 * @example  
	 * let sql = `'${item.money}','${item.notes}','${item.time}'`;
	 * let condition = "'money','notes','time'";
	 * await DB.insertTableData("records", sql, condition);
	 */
	insertOrReplaceData(dbTable, data, condition) {
		// 判断有没有传参
		if (dbTable !== undefined && data !== undefined) {
			if (condition == undefined) {
				var sql = `INSERT OR REPLACE INTO ${dbTable} VALUES('${data}')`;
			} else {
				var sql = `INSERT OR REPLACE INTO ${dbTable} (${condition}) VALUES(${data})`;
			}
			// console.log(sql);
			return new Promise((resolve, reject) => {
				// 表格添加数据
				plus.sqlite.executeSql({
					name: this.dbName,
					sql: sql,
					success(e) {
						resolve(e);
					},
					fail(e) {
						reject(e);
					}
				})
			})
		} else {
			return new Promise((resolve, reject) => {
				reject("错误添加")
			})
		}
	},

	/**
	 * 查询获取数据库里的数据 sql:'SELECT * FROM dbTable WHERE lname = 'lvalue''
	 * @param {String} dbTable 表名
	 * @param {String} [condition = ''] 查找条件
	 * @example
	 * const searchCondition = `WHERE date = '${day}'`
	 * await DB.selectTableData('表名', searchCondition);
	 */
	selectTableData(dbTable, condition = '') {
		if (dbTable !== undefined) {
			var sql = `SELECT * FROM ${dbTable} ${condition}`;
			return new Promise((resolve, reject) => {
				// 表格查询数据  执行查询的SQL语句
				plus.sqlite.selectSql({
					name: this.dbName,
					sql: sql,
					success(e) {
						resolve(e);
					},
					fail(e) {
						reject(e);
					}
				})
			})
		} else {
			return new Promise((resolve, reject) => {
				reject("错误查询")
			});
		}
	},

	/**
	 * 删除表里的数据 sql:'DELETE FROM dbTable WHERE lname = 'lvalue''
	 * @param {String} dbTable 表名
	 * @param {String} [condition = ''] 查找条件
	 * @example
	 * const searchCondition = `WHERE date = '${day}'`
	 * await DB.deleteTableData('表名', searchCondition);
	 */
	deleteTableData(dbTable, condition = '') {
		if (dbTable !== undefined) {
			var sql = `DELETE FROM ${dbTable} ${condition}`;
			return new Promise((resolve, reject) => {
				// 删除表数据
				plus.sqlite.executeSql({
					name: this.dbName,
					sql: sql,
					success(e) {
						resolve(e);
					},
					fail(e) {
						reject(e);
					}
				})
			})
		} else {
			return new Promise((resolve, reject) => {
				reject("错误删除")
			});
		}
	},

	// 修改数据表里的数据 sql:"UPDATE dbTable SET 列名 = '列值',列名 = '列值' WHERE lname = 'lvalue'"
	// 修改 UPDATE 、 dbTable 是表名, data: 要修改的列名=修改后列值, lname,lvalue 是查询条件的列名和列值
	updateTableData(dbTable, data, lname, lvalue) {
		if (lname == undefined) {
			var sql = `UPDATE ${dbTable} SET ${data}`;
		} else {
			var sql = `UPDATE ${dbTable} SET ${data} WHERE ${lname} = '${lvalue}'`;
		}
		// WHERE 前面是要修改的列名、列值,后面是条件的列名、列值
		return new Promise((resolve, reject) => {
			// 修改表数据
			plus.sqlite.executeSql({
				name: this.dbName,
				sql: sql,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	},

	// 获取指定数据条数  sql:"SELECT * FROM dbTable ORDER BY 'id' DESC LIMIT 15 OFFSET 'num'"
	// dbTable 表名, ORDER BY 代表排序默认正序, id 是排序的条件 DESC 代表倒序,从最后一条数据开始拿
	// LIMIT 15 OFFSET '${num}',这句的意思是跳过 num 条拿 15 条数据, num 为跳过多少条数据是动态值
	// 例 初始num设为0,就从最后的数据开始拿15条,下次不拿刚获取的数据,所以可以让num为15,这样就能一步一步的拿完所有的数据
	pullSQL(dbTable, id, num) {
		return new Promise((resolve, reject) => {
			plus.sqlite.selectSql({
				name: this.dbName,
				sql: `SELECT * FROM ${dbTable} ORDER BY '${id}' DESC LIMIT 15 OFFSET '${num}'`,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	}
}

使用案例

这里给了几个简单的案例,一通百通

import DB from "@/api/sqlite";

/**添加或者更新加班费,主键是日期
 * @param {Object} submitParam 单个日期的加班信息
 * @param {Number} submitParam.money 加班费
 * @param {String} submitParam.notes 备注
 * @param {Date} submitParam.date 加班日期
 * @param {String} submitParam.info 日历日期下面显示内容
 */
async function recordSalary(submitParam) {
	try {
		// 新增 DB.insertTableData(表名, 对应表头列的数据)
		let sql = `${submitParam.money},'${submitParam.notes}','${submitParam.date}','${submitParam.info}'`;
		let condition = "'money','notes','date','info'";
		await DB.insertOrReplaceData(DB.recordsTable, sql, condition);
		return '添加/更新加班费成功';
	} catch (e) {
		throw e;
	}
}

/**通过年月查询加班费记录
 * @param {String} month 日期
 * @example queryRecordsByMonth('2023-12')
 */
async function queryRecordsByMonth(month) {
	try {
		const searchCondition = `WHERE strftime('%Y-%m', date) = '${month}'`
		const records = await DB.selectTableData(DB.recordsTable, searchCondition);
		return records;
	} catch (e) {
		throw e;
	}
}

/**通过具体日期查询加班费记录
 * @param {String} day 日期
 * @example queryRecordsByMonth('2023-12-20')
 */
async function queryRecordsByDay(day) {
	try {
		const searchCondition = `WHERE date = '${day}'`
		const records = await DB.selectTableData(DB.recordsTable, searchCondition);
		return records;
	} catch (e) {
		throw e;
	}
}

/**通过具体日期删除该天的加班记录
 * @param {Object} day 日期
 * @example deleteRecordByDate('2023-12-20')
 */
async function deleteRecordByDate(day) {
	try {
		const searchCondition = `WHERE date = '${day}'`
		const result = await DB.deleteTableData(DB.recordsTable, searchCondition);
		return '删除记录成功';
	} catch (e) {
		throw e;
	}
}

export default {
	recordSalary,
	queryRecordsByMonth,
	queryRecordsByDay,
	deleteRecordByDate
}

查看数据库数据

这里我不知道有没有更好的方法,目前我是用真机调试的,所以只需要按上述文章所述的目录找到 .db 数据库文件
然后使用数据库连接工具,这里使用的是Navicat,跟着下述操作即可
在这里插入图片描述
在这里插入图片描述
这样就可以成功查看啦
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3842充电器电路图大全

3842充电器电路图(一) UC3842组成的充电器电路 图1中C1、V1~V4、C2组成滤波整流电路,变压器T为高频变压器,V5、R2、C11组成功率开关管V7的保护电路,NF为供给IC电源的绕组。单端输出IC为UC3842,…

在Linux安装的Docker中开启IPv6

先在Linux中安装docker,然后在docker中开启IPv6。 安装docker 第一步,卸载旧版本docker。 若系统中已安装旧版本docker,则需要卸载旧版本docker以及与旧版本docker相关的依赖项。 命令:yum -y remove docker docker-client do…

Sirius:一款功能强大的通用漏洞扫描工具

关于Sirius Sirius是一款功能强大的通用漏洞扫描工具,该工具可以帮助广大研究人员在大多数场景下识别和验证应用程序中存在的安全漏洞。 现如今,信息安全社区仍然是收集网络安全情报数据最佳且最有利的来源,而且社区本身的表现经常会优于商…

SparkSQL的编程模型(DataFrame和DataSet)

1.2 SparkSQL的编程模型(DataFrame和DataSet) 1.2.1 编程模型简介 主要通过两种方式操作SparkSQL,一种就是SQL,另一种为DataFrame和Dataset。 SQL SQL不用多说,就和Hive操作一样,但是需要清楚一点的时候,SQL操作的是…

C#联合halcon开发,连接相机颜色不对,无法连接相机

相机可以在海康软件MVS中打开(颜色正常),但是在C#开发的程式中无法打开(彩色相机颜色显示异常)。 1.异常处理 1.查看相机和MVS软件是否连接成功; 2.如果成功,连接C#程序; 3.程序连接…

usb端口管理软件有哪些(usb端口管理软件)

USB端口管理软件在当今的计算机使用中扮演着越来越重要的角色。随着USB设备的普及,如U盘、移动硬盘、数码相机等,相应的管理软件也变得越来越受欢迎。 1、USB端口管理软件可以帮助用户更好地管理和控制U盘的使用。 在插入U盘时,软件可以自动…

GEE:基于MCD64A1的GlobFire火灾斑块检测数据集

作者:CSDN _养乐多_ 本文将介绍 Google Earth Engine(GEE)上存档的 JRC/GWIS/GlobFire/v2/FinalPerimeters 数据集。 文章目录 一、背景介绍1.1 MCD64A1数据集1.2 GlobFire1.3 参考文献1.4 GEE上存档 二、案例代码2.1 查看所有数据ID2.2 可…

Python---TCP 网络应用程序开发流程

1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发 说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序,专门为客户端提供数据服务。 2. TCP 客户端程序开发流程的介绍 步…

java并发编程三 共享内存的问题和synchronized解决方案

文章目录 共享带来的问题synchronized 解决方案方法上的 synchronized 共享带来的问题 小故事 老王(操作系统)有一个功能强大的算盘(CPU),现在想把它租出去,赚一点外快 小南、小女(线程&…

世微 AP5186 3.6-100V 三功能降压恒流LED驱动IC

产品描述 AP5186 是一款集成三功能的开关降压型 LED 恒流驱动器。通过电源的接通与关断可实现 功能之间的切换:100%全亮→25%暗亮→爆闪。 AP5186 内部还集成了 VDD 稳压管,过温保护电路,短路保护电路等,用少量的元器 件即可提供…

Pip:基本命令和使用的指南,实现有效的包管理

目录 学习目标: 学习内容: 学习时间: 学习产出: 介绍 Pip 工具:Pip 是 Python 包管理工具,可以帮助用户方便地安装、管理和升级 Python 包: 安装 Pip 工具:学习如何在不同操作系统上…

国产系统-银河麒麟桌面版系统进入root用户

系统版本 :::warning 银河麒麟桌面版操作系统V10 ::: 方式1 :::warning sudo suroot即便设置了密码,这种方式也可以进入 ::: demodemo-pc:~/桌面$ sudo su 输入密码 rootdemo-pc:/home/demo/桌面#方式2 :::warning root用户设置了密码,直接su root进入 ::: root设置密码 …

用模型预测测试数据

Hi, I’m Shendi 2、用模型预测测试数据 在之前已经训练好了一个模型,可以通过 model.save("path") 来保存模型到硬盘,下次直接使用。 这个模型使用的 mnist 数据集训练,这个数据集包含6万训练样本和一万测试样本,28*28…

12 Vue3中使用v-if指令实现条件渲染

概述 v-if指令主要用来实现条件渲染,在实际项目中使用得也非常多。 v-if通常会配合v-else-if、v-else指令一起使用,可以达到多个条件执行一个,两个条件执行一个,满足一个条件执行等多种场景。 下面,我们分别演示这三…

SAP ABAP SCREEN日期字段添加搜索帮助

文章目录 前言 前言 有时我们在自定义屏幕中添加了日期的输入框没有带出F4搜索帮助,如下设置 为字段手动添加一个搜索帮助BU_DATE_CHAR

mybatis-plus-枚举处理

properties文件的配置 //加载处理枚举类型处理的包路径 mybatis-plus.typeEnumsPackagecom.common.base.enums.** yaml配置文件的配置 # MP 配置 mybatis-plus: # type-enums-package: com.baomidou.mybatisplus.samples.enums.enumsconfiguration:# 3.0.8之前版本问题默认将…

DC-磁盘管理

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 在DC2上安装及配置软RAID 5。在安装好的DC2虚拟机中添加三块10G虚拟磁盘。组成RAID 5,磁盘分区命名为卷标H盘:Raid5。手动测试破坏一块磁盘,做RAID磁盘修复,确认RAID 5配置完毕。配置步骤 关闭虚拟机,添加3块10G磁…

java web中日期Date类型在页面中格式化显示的三种方式

一般我们经常需要在将服务器端的Date类型,传到页面进行显示,这就涉及到一个如何格式化显示Date类型的问题,一般我们有三种方式进行: 1)在服务端使用SimpleDateFormat等类格式化成字符串,然后传给客户端&am…

全新Facebook养号指南,怎么做才能不被封号?

最近听很多跨境电商小伙伴们说 Facebook 又被封号了,可能是你的 Facebook 账号还不够稳定,或者说还没有足够的粉丝和互动。如果你想让自己的 Facebook 账号更加稳定,就需要养号。俗话说,一封回到解放前,为什么你明明有…

leetcode 974. 和可被 K 整除的子数组(优质解法)

代码&#xff1a; class Solution {public int subarraysDivByK(int[] nums, int k) {HashMap<Integer,Integer> hashMapnew HashMap();hashMap.put(0,1);int count0; //记录子数组的个数int last0; //前一个下标的前缀和int now0; //当前下标的前缀和for(int i0;…