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
}
相关推荐
星星也在雾里9 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
雨辰AI10 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城202410 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有11 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao11 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_7488394911 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录11 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能
海市公约12 小时前
MySQL更新语句执行全流程:从Buffer Pool修改到二阶段提交
数据库·mysql·binlog·innodb·undo log·二阶段提交·update执行原理
一颗小青松12 小时前
uniapp输入框fixed定位,导致页面顶起解决方案
前端·uni-app
颂love12 小时前
MySQL的执行流程
android·数据库·mysql