/** * SQLite数据库操作模块 * 提供数据库初始化、执行SQL语句、查询数据等功能 */ import { dbConfig } from './dbconfig.js'; import { createTables, initData } from './sql.js'; /** * 初始化数据库 * @returns {Promise} 返回Promise对象 */ export const initDatabase = () => { return new Promise((resolve, reject) => { // 创建表 createAllTables() .then(() => { // 初始化数据 return initializeData(); }) .then(() => { resolve(); }) .catch(err => { console.error('数据库初始化失败', err); reject(err); }); }); }; /** * 创建所有表 * @returns {Promise} 返回Promise对象 */ const createAllTables = () => { return new Promise(async (resolve, reject) => { try { for (const sql of createTables) { await executeSql(sql); } resolve(); } catch (error) { reject(error); } }); }; /** * 初始化数据 * @returns {Promise} 返回Promise对象 */ const initializeData = () => { return new Promise(async (resolve, reject) => { try { for (const sql of initData) { await executeSql(sql); } resolve(); } catch (error) { reject(error); } }); }; /** * 执行SQL语句 * @param {string} sql SQL语句 * @param {Array} params 参数数组 * @returns {Promise} 返回Promise对象 */ export const executeSql = (sql, params = []) => { return new Promise((resolve, reject) => { try { openDatabase() let exeSql = formatSQL(sql, params); // console.log(exeSql) plus.sqlite.executeSql({ name: dbConfig.dbName, sql: exeSql, success: (e) => { resolve(e); }, fail: (e) => { console.error('SQL执行失败', sql, params, e); reject(e); } }); } catch (e) { console.log('executeSql执行SQL语句失败', e) } finally { closeDatabase(); } }); }; /** * 查询数据 * @param {string} sql SQL查询语句 * @param {Array} params 参数数组 * @returns {Promise} 返回查询结果数组 */ export const query = (sql, params = []) => { return new Promise((resolve, reject) => { let exeSql = formatSQL(sql, params); try { // console.log(exeSql) openDatabase() plus.sqlite.selectSql({ name: dbConfig.dbName, sql: exeSql, success: (e) => { resolve(e); }, fail: (e) => { console.error('查询失败', sql, params, e); reject(e); } }); } catch (e) { console.log(`query执行SQL语句失败【${exeSql}】`, e) } finally { closeDatabase(); } }); }; /** * 开始事务 * @returns {Promise} 返回Promise对象 */ export const beginTransaction = () => { return executeSql('BEGIN TRANSACTION'); }; /** * 提交事务 * @returns {Promise} 返回Promise对象 */ export const commitTransaction = () => { return executeSql('COMMIT'); }; /** * 回滚事务 * @returns {Promise} 返回Promise对象 */ export const rollbackTransaction = () => { return executeSql('ROLLBACK'); }; /** * 插入数据并返回插入的ID * @param {string} tableName 表名 * @param {Object} data 要插入的数据对象 * @returns {Promise} 返回插入的ID */ export const insert = async (tableName, data) => { const keys = Object.keys(data); const values = Object.values(data); const placeholders = keys.map(() => '?').join(','); // console.log(data) const sql = `INSERT INTO ${tableName} (${keys.join(',')}) VALUES (${placeholders})`; await executeSql(sql, values); // 获取最后插入的ID const result = await query("SELECT * from sqlite_sequence where name = '" + tableName + "'"); return result[0].seq; }; /** * 更新数据 * @param {string} tableName 表名 * @param {Object} data 要更新的数据对象 * @param {string} whereClause WHERE子句 * @param {Array} whereParams WHERE子句参数 * @returns {Promise} 返回Promise对象 */ export const update = (tableName, data, whereClause, whereParams = []) => { const keys = Object.keys(data); const values = Object.values(data); const setClause = keys.map(key => `${key} = ?`).join(','); const sql = `UPDATE ${tableName} SET ${setClause} WHERE ${whereClause}`; return executeSql(sql, [...values, ...whereParams]); }; /** * 删除数据 * @param {string} tableName 表名 * @param {string} whereClause WHERE子句 * @param {Array} whereParams WHERE子句参数 * @returns {Promise} 返回Promise对象 */ export const deleteData = (tableName, whereClause, whereParams = []) => { const sql = `DELETE FROM ${tableName} WHERE ${whereClause}`; return executeSql(sql, whereParams); }; // 打开/创建数据库 const openDatabase = () => { // #ifdef APP-PLUS return new Promise((resolve, reject) => { plus.sqlite.openDatabase({ name: dbConfig.dbName, path: dbConfig.dbPath, version: dbConfig.dbVersion, success: (e) => { resolve(e) }, fail: (e) => reject(`数据库打开失败: ${JSON.stringify(e)}`) }); }); // #endif } /** * 关闭数据库 * @returns {Promise} 返回Promise对象 */ const closeDatabase = () => { return new Promise((resolve, reject) => { plus.sqlite.closeDatabase({ name: dbConfig.dbName, path: dbConfig.dbPath, success: (e) => resolve(e), fail: (e) => reject(`数据库关闭失败: ${JSON.stringify(e)}`) }); }); } /** * 检查数据库是否已初始化 * @returns {boolean} 是否已初始化 */ export const isDatabaseInitialized = () => { return db !== null; }; /** * 获取数据库信息 * @returns {Object} 数据库信息 */ export const getDatabaseInfo = () => { return { name: dbConfig.dbName, version: dbConfig.dbVersion, path: dbConfig.dbPath }; }; // SQL格式化工具函数 // SQL格式化工具函数 const formatSQL = (sql, params) => { try { return sql.replace(/\?/g, (match) => { const value = params.shift(); // 处理不同类型的数据 if (value === null || value === undefined) return 'NULL'; if (typeof value === 'string') return `'${value.replace(/'/g, "''")}'`; if (value instanceof Date) return `'${value.toISOString()}'`; return value; }); } catch (e) { console.error('SQL格式化错误', e); } }