uniapp项目使用sqlite数据库

  1. 打开 manifest.json,进入「App模块权限配置」,勾选 SQLite (数据库) 选项

  2. 创建 static/sqlite/sqlite.js 文件进行统一管理

javascript 复制代码
// 数据库名称
const dbName = 'scan'
// 数据库地址
const dbPath = '_downloads/scan.db'

// 判断数据库是否打开
const isOpen = () => {
	var open = plus.sqlite.isOpenDatabase({
		name: dbName,
		path: dbPath,
	})
	return open
}

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

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

// 建表
const createTable = (dbTable, data) => {
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: `CREATE TABLE IF NOT EXISTS ${dbTable}(${data})`,
			success(e) {
				resolve(e)
			},
			fail(e) {
				reject(e)
			},
		})
	})
}

// 插入数据
const insertTableData = (dbTable, data) => {
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: `INSERT INTO ${dbTable} VALUES (${data})`,
			success(e) {
				resolve(e)
			},
			fail(e) {
				reject(e)
			},
		})
	})
}

// 查询数据
const selectTableData = (dbTable, lname, lvalue) => {
	return new Promise((resolve, reject) => {
		let sql = `SELECT * FROM ${dbTable}`
		if (lname) {
			sql += ` WHERE ${lname} = '${lvalue}'`
		}
		plus.sqlite.selectSql({
			name: dbName,
			sql: sql,
			success(e) {
				resolve(e)
			},
			fail(e) {
				reject(e)
			},
		})
	})
}

// 删除数据
const deleteTableData = (dbTable, lname, lvalue) => {
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: `DELETE FROM ${dbTable} WHERE ${lname} = '${lvalue}'`,
			success(e) {
				resolve(e)
			},
			fail(e) {
				reject(e)
			},
		})
	})
}

// 更新数据
const updateTableData = (dbTable, data, lname, lvalue) => {
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: `UPDATE ${dbTable} SET ${data} WHERE ${lname} = '${lvalue}'`,
			success(e) {
				resolve(e)
			},
			fail(e) {
				reject(e)
			},
		})
	})
}

// 导入数据
const importTableData = (sql) => {
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: sql,
			success(e) {
				resolve(e)
			},
			fail(e) {
				console.log(e);
				reject(e)
			},
		})
	})
}

// 获取所有表名
const getAllTables = () => {
	return new Promise((resolve, reject) => {
		// SQLite 系统表 sqlite_master 存储表结构信息
		plus.sqlite.selectSql({
			name: dbName,
			sql: `SELECT name FROM sqlite_master WHERE type='table'`,
			// sql = "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'";
			success: (data) => {
				const tables = data.map(item => item.name);
				resolve(tables);
			},
			fail: (e) => reject(`查询表失败: ${JSON.stringify(e)}`)
		});
	});
}

// 获取表的建表语句
const getTableCreateSql = (tableName) => {
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: dbName,
			sql: `SELECT sql FROM sqlite_master WHERE type='table' AND name='${tableName}'`,
			success: (data) => {
				const createSql = data[0]?.sql || '';
				resolve(`${createSql};\n`); // 添加分号和换行
			},
			fail: (e) => reject(`查询建表语句失败: ${JSON.stringify(e)}`)
		});
	});
}

// 获取表数据并生成 INSERT 语句
const getTableDataSql = (tableName) => {
	return new Promise((resolve, reject) => {
		// 先查询表的所有字段
		plus.sqlite.selectSql({
			name: dbName,
			sql: `PRAGMA table_info(${tableName})`,
			success: (columnsData) => {
				const columns = columnsData.map(col => col.name);
				const columnsStr = columns.join(',');
				const placeholders = columns.map(() => '?').join(',');

				// 查询表数据
				plus.sqlite.selectSql({
					name: dbName,
					sql: `SELECT * FROM ${tableName}`,
					success: (data) => {
						if (data.length === 0) {
							resolve(''); // 无数据则返回空
							return;
						}

						// 生成 INSERT 语句
						let insertSql =
							`INSERT INTO ${tableName} (${columnsStr}) VALUES\n`;
						data.forEach((row, index) => {
							const values = columns.map(col => {
								const value = row[col];
								// 处理字符串类型(添加单引号,转义内部单引号)
								if (typeof value === 'string') {
									return `'${value.replace(/'/g,  "''")}'`;
								}
								// 处理 null/undefined
								return value === null || value ===
									undefined ? 'NULL' : value;
							}).join(',');
							insertSql +=
								`(${values})${index === data.length  - 1 ? ';\n' : ',\n'}`;
						});
						resolve(insertSql);
					},
					fail: (e) => reject(`查询表数据失败: ${JSON.stringify(e)}`)
				});
			},
			fail: (e) => reject(`查询表结构失败: ${JSON.stringify(e)}`)
		});
	});
}

// 导出方法
export default {
	isOpen,
	openSqlite,
	closeSqlite,
	createTable,
	insertTableData,
	selectTableData,
	deleteTableData,
	updateTableData,
	importTableData,
	getAllTables,
	getTableCreateSql,
	getTableDataSql
}
相关推荐
不爱说话郭德纲4 小时前
告别漫长的HbuilderX云打包排队!uni-app x 安卓本地打包保姆级教程(附白屏、包体积过大排坑指南)
android·前端·uni-app
李广坤8 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区1 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
HashTang1 天前
【AI 编程实战】第 12 篇:从 0 到 1 的回顾 - 项目总结与 AI 协作心得
前端·uni-app·ai编程
JunjunZ1 天前
uniapp 文件预览:从文件流到多格式预览的完整实现
前端·uni-app
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
郑州光合科技余经理2 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
加号32 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏2 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐2 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端