如何在Electron应用中保留数据?

时间:2016-02-26 19:30:17

标签: electron

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

9 个答案:

答案 0 :(得分:29)

目前,

NeDB是Electron by 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
});

列表继续......

答案 1 :(得分:17)

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

模块内部从/ app.getPath('userData')读取/写入JSON:

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

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

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

});

答案 2 :(得分:7)

电子视图使用Webkit构建,可让您访问基于Web的本地存储API。适合简单易用的设置存储。

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

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

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

答案 3 :(得分:7)

有一个很好的模块用于在elecron中存储用户数据。它被称为electron-store

安装

$ 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

这个模块有很多功能,有很多advantages over window.localStorage

答案 4 :(得分:5)

有一个模块提供了简单的方法来获取和设置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(filePath,data,cb)

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

storage.set(filePath,data)

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

storage.isPathExists(path,cb)

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

storage.isPathExists(路径)

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

答案 5 :(得分:4)

由于NeDB的最新版本是4年前,并且存在许多未解决的问题,所以我不建议这样做。但是,您现在可以使用许多其他选择。

https://github.com/pubkey/rxdb(许多功能,可观察到的查询)

https://github.com/pouchdb/pouchdb(简单但有许多未解决的问题)

https://github.com/techfort/LokiJS(仅限内存存储)

https://github.com/typicode/lowdb(适用于简单的小型数据集)

答案 6 :(得分:2)

您可以使用Indexeddb,由于以下原因,它最有可能满足客户端应用程序的需求:

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

总而言之,这是一个不错的选择。唯一的警告是,如果未设置navigator.storage.persist,或者在主机崩溃时,索引内核处于损坏状态,那么当存储处于紧张状态时,铬核可能会自动清除indexeddb以回收磁盘空间。

答案 7 :(得分:1)

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

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

或者,如果要存储配置,则可以直接存储在操作系统的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;
  }
 }

答案 8 :(得分:0)

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

您可以查看persist data in Electron apps

的方法/工具列表