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
}
相关推荐
FinelyYang6 小时前
UniApp + LiveKit:Android 端为什么要用原生做屏幕共享,以及我们怎么落地的
android·uni-app
xier_ran6 小时前
【infra之路】GPU 存储层次总结:L1 / L2 / HBM
java·网络·数据库
山甫aa7 小时前
Javaweb---MyBatis增删改查
java·数据库·后端·mybatis·springboot
@insist1238 小时前
系统集成项目管理工程师-信息和文档管理
网络·数据库·软考·系统集成项目管理工程师·软考中项·软件水平考试
残 风10 小时前
PostgreSQL 存储机制详解
数据库·postgresql·开源·数据库开发
JacksonMx11 小时前
Java CompletableFuture 异步编程实战:从入门到架构师避坑指南
linux·数据库·python
tachibana211 小时前
性能指标的口径选择
数据库·人工智能·架构·大模型·llm
ggabb11 小时前
汉语与英语启蒙读物:两种文明基因的深层对话
sqlite
机器人梦想家12 小时前
具身机器人视觉服务的异步回调与并发控制
数据库·算法·机器人