如何在电子应用程序中实现本地持久性?

时间:2019-05-01 09:38:54

标签: angular database electron persistence

我正在构建一个带有角度前端的电子应用程序,该应用程序监视计算机上的活动窗口以跟踪用户的活动。但是,我在弄清楚如何正确保存此数据方面遇到困难。

我一直在做很多研究,看到有人建议使用IndexedDB / dexie.js,localForage,couchDB,SQLite等。但是,由于我无法理解如何实际实施,因此我正在努力决定使用哪种技术。它们在我的电子应用中-实际电子实现的文档非常稀疏。

我之所以这么努力,是因为可能存在一些创建我不太了解的电子应用程序的关键概念。

我认为,区分main.ts(电子)是后端而我的角度应用是前端是错误的,我应该将其整体考虑。也许有人可以详细说明吗?

这种想法使我无法使用像ouchDB这样的样板样板(放置在index.html-> frontend中):

    <html>
      <head>
          <!-- Include Dexie -->
          <script src="https://unpkg.com/dexie@latest/dist/dexie.js"></script>

          <script>
              //
              // Define your database
              //
              var db = new Dexie("friend_database");
              db.version(1).stores({
                  friends: 'name,shoeSize'
              });

              //
              // Put some data into it
              //
              db.friends.put({name: "Nicolas", shoeSize: 8}).then (function(){
                  //
                  // Then when data is stored, read from it
                  //
                  return db.friends.get('Nicolas');
              }).then(function (friend) {
                  //
                  // Display the result
                  //
                  alert ("Nicolas has shoe size " + friend.shoeSize);
              }).catch(function(error) {
                 //
                 // Finally don't forget to catch any error
                 // that could have happened anywhere in the
                 // code blocks above.
                 //
                 alert ("Ooops: " + error);
              });
          </script>
      </head>
    </html>

这对我来说似乎是一个问题,因为我实际上是从我认为是后端的位置获取活动窗口的数据。

为了更好地理解我的问题,以下是一些代码片段,我认为这些代码片段对于回答这个问题很重要。

首先,我创建了一个Poller.ts,顾名思义是民意调查。我用它来使活动窗口连续在PC上运行。

Poller.ts


    import * as EventEmitter from 'events';


    export default class Poller extends EventEmitter {
      private timeout: number;

      constructor(timeout = 5000) {
        super();
        this.timeout = timeout;
      }

      public poll(): void {
        setTimeout(() => this.emit('poll'), this.timeout);
      }

      public onPoll(cb): void {
        this.on('poll', cb);
      }
    }

然后在Main.ts中,将此轮询器与active-win库一起使用以获取活动窗口。

Main.ts


    ipcMain.on('tracking:start', (e) => {
      poller.poll();
      (async () => {
        console.log('Starting tracking');
      })();
    });

    ipcMain.on('tracking:stop', () => {
      (async () => {
        console.log('Stopping tracking');
      })();
    });

    poller.onPoll(() => {
      (async () => {
        let activeWindow = await activeWin();
        console.log(activeWindow);
      })();
      poller.poll();
    });

并且由ipcRenderer发送的事件从前端开始/停止轮询过程。

角度组件


    public startTracking() {
        console.log('starting tracking');
        if (this.electronService.isElectronApp) {
          this.electronService.ipcRenderer.send('tracking:start');
        }
      }

      public stopTracking() {
        console.log('stopping tracking');
        if (this.electronService.isElectronApp) {
          this.electronService.ipcRenderer.send('tracking:stop');
        }
      }

根据我的理解,我应该保留位于我认为是后端的轮询功能中的数据,这与我对上面列出的持久性库的理解不一致。

我希望能够将每个窗口日志存储为一个单独的条目,并对数据进行一些查询和分类。

因此,我希望你们中的任何一个可以阐明我的误解,或者建议一个适合我目的的图书馆。

1 个答案:

答案 0 :(得分:1)

Electron文档的一部分稀疏的原因是因为这些机制不是来自Electron的,它们是常规的浏览器技术(例如Chrome,Firefox等)。您应该在MDN(Mozilla开发人员网络)上查询所需的内容:https://developer.mozilla.org。例如,尝试在Google上搜索“ mdn localstorage”,“ mdn indexeddb”,“ mdn cachestorage”或“ mdn cookie”,然后您将开始找到有关本地离线存储内容的文档。

编辑:注意,您不能在Web浏览器中使用CouchDB或SQLite之类的东西,而且这些东西也不是特定于Electron的。您可以搜索“ Node.js CouchDB”或“ Node.js SQLite”以查找这些资源,因为Electron写在Node.js之上。

您可以在Node.js项目中使用的任何东西,都可以在Electron中使用。同样,在Chrome可以使用的浏览器技术中,您可以在Electron中使用,因为Electron将Chrome浏览器引擎与Node.js结合在一起。