z8018
8 天以前 d5317aef1dbb595923af02ede8bfa33ba37d6eb6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
/**
 * 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<Array>} 返回查询结果数组
 */
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<number>} 返回插入的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);
    }
 
}