|
electron使用sqlcipher中的db.run封闭到函数中,同步得到返回值,
在 Electron 中,如果你希望将 `db.run` 封装到一个函数中,并且希望能够同步地获取返回值,可以使用 JavaScript 的 Promise 来实现。由于 `db.run` 是一个异步操作,通常会返回一个回调或 Promise,因此你可以通过 `async/await` 来处理它。以下是一个示例,展示如何实现这一点。
### 示例代码
- const sqlite3 = require('sqlite3').verbose();
- const SQLCipher = require('sqlcipher');
- // 创建或打开数据库
- let db = new SQLCipher.Database('test.db');
- // 使用密码打开数据库
- db.exec("PRAGMA key = 'your_password';", (err) => {
- if (err) {
- console.error(err.message);
- } else {
- // 创建表
- db.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);", (err) => {
- if (err) {
- console.error(err.message);
- }
- });
- }
- });
- // 封装 db.run 到一个函数中
- function runQuery(sql, params) {
- return new Promise((resolve, reject) => {
- db.run(sql, params, function (err) {
- if (err) {
- reject(err); // 如果出错,拒绝 Promise
- } else {
- resolve(this.lastID); // 返回插入的行 ID
- }
- });
- });
- }
- // 使用 async/await 调用函数
- async function insertUser(name) {
- const sql = "INSERT INTO users (name) VALUES (?)";
- try {
- const lastID = await runQuery(sql, [name]);
- console.log(`插入的行 ID: ${lastID}`);
- } catch (error) {
- console.error('插入失败:', error.message);
- }
- }
- // 插入数据
- insertUser('Alice');
- // 关闭数据库
- db.close();
复制代码
### 解释
1. **创建或打开数据库**:使用 `new SQLCipher.Database('test.db')` 创建或打开数据库。
2. **设置密码**:使用 `PRAGMA key = 'your_password';` 设置数据库密码。
3. **创建表**:使用 `CREATE TABLE` 创建一个用户表。
4. **封装 `db.run` **:定义 `runQuery` 函数,该函数返回一个 Promise。 `db.run` 被封装在 Promise 中,如果成功执行,则解析 Promise 并返回插入的行 ID;如果出错则拒绝 Promise。
5. **使用 `async/await` **:定义 `insertUser` 函数,使用 `await` 调用 `runQuery` 函数来插入用户数据,并处理可能的错误。
6. **插入数据**:调用 `insertUser('Alice')` 来插入一条新数据。
7. **关闭数据库**:最后关闭数据库连接。
### 总结
通过将 `db.run` 封装在 Promise 中并使用 `async/await` ,你可以实现同步的效果来获取返回值。这种方式使得代码更加清晰易懂。
|
|