【发布时间】:2021-04-27 07:29:27
【问题描述】:
(这里是全新的学习 Electron,所以我确信这是一个基本问题,我缺少一些基本的东西......)
如何从 Electron 应用程序前端与本地数据库(我正在使用 Sqlite)进行交互?我有一个非常基本的数据库管理器类,在我的 Electron 应用程序的 index.js 文件中使用它没有问题。但是从前端(我使用的是 Svelte,但我可能可以翻译其他前端框架的解决方案),如何与数据库交互?这似乎很基本,但我正在努力寻找一个基本的例子。
由于一切都是本地的,似乎没有必要设置一个完整的 API 来来回整理数据,但也许是这样?但如果是这样,如何告诉 Electron “后端”(如果这是正确的术语)做某事并将结果返回到前端?我看到了一些关于 IPC 的东西,但现在这没有多大意义,而且似乎有点矫枉过正。
这是我的简单数据库管理器类:
const sqlite3 = require("sqlite3").verbose();
class DbManager {
#db;
open() {
this.#db = new sqlite3.Database("testing.db", sqlite3.OPEN_READWRITE);
}
close() {
this.#db.close();
}
run(sql, param) {
this.#db.run(sql, param);
return this;
}
}
const manager = new DbManager();
module.exports = manager;
我可以调用它并从 Electron 入口点 index.js 做任何没有问题的事情:
const { app, BrowserWindow, screen } = require("electron");
require("electron-reload")(__dirname);
const db = require("./src/repository/db");
const createWindow = () => {
...
};
let window = null;
app.whenReady().then(() => {
db.open();
createWindow();
});
app.on("window-all-closed", () => {
db.close();
app.quit();
});
但是我的组件该怎么做呢?
<script>
// this won't work, and I wouldn't expect it to, but not sure what the alternative is
const db = require("./repository/db");
let accountName;
function addAccount() {
db.run("INSERT INTO accounts (name) VALUES ($name);", { $name: accountName });
}
</script>
<main>
<form>
<label for="account_name">Account name</label>
<input id="account_name" bind:value={accountName} />
<button on:click={addAccount}>Add account</button>
</form>
</main>
如果有人知道做类似事情的样板实现,那将非常有帮助。显然,这就像这里的应用程序 101;我只是不确定如何在 Electron 中解决这个问题,希望有人指出我正确的方向。
【问题讨论】: