如何在 Electron 应用程序中保存数据? [已关闭]

问题描述 投票:0回答:8

我一直在搜索 Electron 文档,尝试找出如何在 Electron 应用程序中保存数据。例如,在 iOS 或 OS X 中,您可以使用 NSUserDefaults 来存储用户设置和首选项。我想做类似的事情。如何在 Electron 应用程序中保存数据?

electron
8个回答
34
投票

NeDB 是目前 Electron 唯一推荐或推荐的作为 Electron 嵌入式持久数据库的工具。 - http:// Electron.atom.io/community/

如果设置很复杂,存储用户设置也很有用。

为什么 NeDB 可以成为这种情况下更好的解决方案?

Node.js、nw.js、Electron 的嵌入式持久数据库或内存数据库 和浏览器,100% JavaScript,无二进制依赖。 API 是一个子集 MongoDB 的,而且速度非常快。 - NeDB

创建或加载数据库:

var Datastore = require('nedb')
  , db = new Datastore({ filename: 'path/to/datafile', autoload: true });
// You can issue commands right away

插入文档:

var doc = { hello: 'world'
               , n: 5
               , today: new Date()
               , nedbIsAwesome: true
               , notthere: null
               , notToBeSaved: undefined  // Will not be saved
               , fruits: [ 'apple', 'orange', 'pear' ]
               , infos: { name: 'nedb' }
               };

db.insert(doc, function (err, newDoc) {   // Callback is optional
  // newDoc is the newly inserted document, including its _id
  // newDoc has no key called notToBeSaved since its value was undefined
});

查找文档:

// Finding all inhabited planets in the solar system
db.find({ system: 'solar', inhabited: true }, function (err, docs) {
  // docs is an array containing document Earth only
});

这样的例子还在继续......

更新 - 2019 年 9 月

截至 2019 年,这不再是有效的答案。请参阅下面 @jviotti@Tharanga 的答案。


27
投票

我编写了一个名为 electron-json-storage 的 NPM 模块,旨在将其抽象出来并为开发人员提供一个漂亮且简单的界面。

模块在内部读取/写入 JSON

app.getPath('userData')
:

const storage = require('electron-json-storage');

// Write
storage.set('foobar', { foo: 'bar' }, function() {

    // Read
    storage.get('foobar', function(error, object) {
        if (error) throw error
        console.log(object.foo);
        // will print "bar"
    });

});

25
投票

elecron 中有一个很好的模块用于存储用户数据。它被称为电子商店

安装

$ npm install electron-store

示例用法(从github页面复制)

const Store = require('electron-store');
const store = new Store();

store.set('unicorn', '🦄');
console.log(store.get('unicorn'));
//=> '🦄'

// Use dot-notation to access nested properties
store.set('foo.bar', true);
console.log(store.get('foo'));
//=> {bar: true}

store.delete('unicorn');
console.log(store.get('unicorn'));
//=> undefined

这个模块有很多功能,并且比window.localStorage有很多优点


13
投票

除了其他答案中提到的之外,您还有多种选择。

选项 1 - SQL 数据

如果您想将数据存储在 SQL 数据库中,那么您可以 https://github.com/mapbox/node-sqlite3

选项 2 - 配置数据

或者如果您要存储配置,您可以直接存储在操作系统的

userData
存储中。

 const electron = require('electron');
 const fs = require('fs');
 const path = require('path');

 const dataPath = electron.app.getPath('userData');
 const filePath = path.join(dataPath, 'config.json');

 function writeData(key, value){
   let contents = parseData()
   contents[key] = value;
   fs.writeFileSync(filePath, JSON.stringify(contents));
 }

 function readData(key, value) {
  let contents = parseData()
  return contents[key]
 }

 function parseData(){
   const defaultData = {}
   try {
    return JSON.parse(fs.readFileSync(filePath));
  } catch(error) {
    return defaultData;
  }
 }

12
投票

Electron 视图是使用 Webkit 构建的,它使您可以访问基于 Web 的本地存储 api。适合简单易用的设置存储。

如果您需要更强大的功能或需要从主脚本访问存储,您可以使用众多基于节点的存储模块之一。我个人喜欢lowdb

对于大多数节点存储模块,您将需要提供文件位置。尝试:

var app = require('app');
app.getPath('userData');

7
投票

有一个模块提供了简单的方法来获取和设置 json 文件到此目录,如果需要的话创建子目录并支持回调和承诺:

https://github.com/ran-y/electron-storage

自述:

安装

$ npm install --save electron-storage

用法

const storage = require('electron-storage');

API

storage.get(filePath, cb)

storage.get(filePath, (err, data) => {
  if (err) {
    console.error(err)
  } else {
    console.log(data);
  }
});

storage.get(文件路径)

storage.get(filePath)
.then(data => {
  console.log(data);
})
.catch(err => {
  console.error(err);
});

storage.set(文件路径,数据,cb)

storage.set(filePath, data, (err) => {
  if (err) {
    console.error(err)
  }
});

storage.set(文件路径, 数据)

storage.set(filePath, data)
.then(data => {
  console.log(data);
})
.catch(err => {
  console.error(err);
});

storage.isPathExists(路径, cb)

storage.isPathExists(path, (itDoes) => {
  if (itDoes) {
    console.log('pathDoesExists !')
  }
});

storage.isPathExists(路径)

storage.isPathExists(path)
.then(itDoes => {
  if (itDoes) {
    console.log('pathDoesExists !')
  }
});

2
投票

您可以选择 Indexeddb,它很可能适合客户端应用程序的需求,因为:

  • 其内置的版本控制机制。客户端应用程序经常面临版本碎片,因为用户通常不会同时更新到新版本。因此,检查现有数据库的版本并进行相应更新是一个好主意。
  • 它是无模式的,可以灵活地向客户端存储添加更多数据(根据我的经验,这种情况经常发生),而无需将数据库更新到新版本,除非您创建新索引。
  • 它支持广泛的数据:基本类型以及blob数据(文件、图像)

总而言之,这是一个不错的选择。唯一需要注意的是,如果未设置

navigator.storage.persist
,或者当主机崩溃而使 indexeddb 处于损坏状态时,Chromium 核心可能会自动清除 indexeddb 以回收磁盘空间。


1
投票

Electron 中可以使用多种数据持久化方法,选择正确的方法主要取决于您的用例。如果只是保存应用程序设置,那么您可以使用简单的机制,例如平面文件或 HTML5 存储 API,对于高级数据要求,您应该选择大型数据库解决方案,例如 MySQL 或 MongoDB(带或不带 ORM)。

您可以检查此方法/工具列表,以在 Electron 应用程序中保存数据

© www.soinside.com 2019 - 2024. All rights reserved.