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
}
相关推荐
wertyuytrewm1 分钟前
自动化与脚本
jvm·数据库·python
Hello.Reader4 分钟前
PySpark DataFrame 快速入门创建、查询、分组、读写、SQL 实战一篇讲透
数据库·sql·spark
qq_417695056 分钟前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
只能是遇见9 分钟前
ERROR 1524 (HY000) Plugin ‘mysql_native_password‘ is not loaded
android·数据库·mysql
番茄去哪了11 分钟前
从0到1独立开发一个论坛项目(一)
java·数据库·oracle·maven
API开发16 分钟前
一个MCP操作所有的数据库
数据库·api·api接口·apisql·mcp·mcpserver·openclaw
zone7_27 分钟前
008-01:RAG 入门-向量存储与企业级向量数据库 milvus
数据库·milvus
iMingzhen32 分钟前
不想引入 Redis,我用一张 SQLite 表实现了消息队列
数据库·redis·ai·sqlite
冷小鱼33 分钟前
Milvus 向量数据库完全指南:开源架构与生产级部署实战
数据库·开源·milvus
Curvatureflight38 分钟前
Redis实战:缓存设计与高频场景全解析
数据库·redis·缓存