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
}
相关推荐
小徐_233312 小时前
Wot UI 2.2.0 发布:Button 新增 subtle,VideoPreview 预览体验继续增强
前端·微信小程序·uni-app
倔强的石头_12 小时前
《Kingbase护城河》——猎捕慢查询:执行计划的微观解析与索引调优实战
数据库
SelectDB14 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
宸翰2 天前
解决 uni-app App 端 vue-i18n 占位符丢失:封装跨端可用的 tf 格式化方法
前端·vue.js·uni-app
jiayou642 天前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE3 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
时光足迹3 天前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
时光足迹3 天前
腾讯云 TRTC UniApp SDK 从入门到上线
前端·vue.js·uni-app
时光足迹3 天前
uni-app 里把加密视频嵌入页面播放?我分析了 4 种方案,只有 1 种接近完美
前端·vue.js·uni-app
时光足迹3 天前
JPush UniApp UTS 插件完全参考手册:API、事件与厂商通道一网打尽
vue.js·ios·uni-app