Как сохранить данные в приложении Electron?

Я просматривал документацию Electron, чтобы попытаться выяснить, как сохранить данные в приложении Electron. Например, в iOS или OS X вы можете использовать NSUserDefaults для хранения пользовательских настроек и настроек. Я хотел бы сделать что-то подобное. Как сохранить данные в приложении Electron?

Ответы

Ответ 1

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 года

По состоянию на 2019 год это уже не правильный ответ. Смотрите ответы @jviotti и @Tharanga ниже.

Ответ 2

Существует модуль NPM, который я написал под названием electron-json-storage, который предназначен для абстрагирования этого и предоставления приятного и легкого интерфейса разработчику.

Модуль внутренне считывает/записывает JSON в/из app.getPath('userData'):

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"
    });

});

Ответ 3

Электронные представления создаются с помощью Webkit, который дает вам доступ к API-интерфейсу localstorage. Хорошо для простого и удобного хранения настроек.

Если вам нужно что-то более мощное или вам нужен доступ к хранилищу из основного сценария, вы можете использовать один из многочисленных модулей хранения на основе узлов. Лично мне нравится lowdb.

В большинстве модулей хранения узлов вам нужно будет указать местоположение файла. Попробуйте:

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

Ответ 4

Имеется хороший модуль для хранения пользовательских данных в электоне. Он назывался 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

Этот модуль имеет много функций и существует много преимуществ перед window.localStorage

Ответ 5

Существует модуль, который предоставляет простые методы для получения и установки файлов json в этот каталог, создает подкаталоги при необходимости и поддерживает обратные вызовы и обещания:

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

Readme:

Установка

$ npm install --save electron-storage

usage

использования
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(Filepath)

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 (путь, кб)

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

storage.isPathExists (путь)

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

Ответ 6

Так как последний выпуск NeDB был 4 года назад и есть много открытых вопросов, я бы не рекомендовал его. Но есть много других альтернатив, которые вы можете использовать сейчас.

https://github.com/pubkey/rxdb  (много возможностей, наблюдаемые запросы)

https://github.com/pouchdb/pouchdb  (простой, но много открытых вопросов)

https://github.com/techfort/LokiJS  (только в памяти)

https://github.com/typicode/lowdb  (хорошо для простых, небольших наборов данных)

Ответ 7

Вы можете выбрать Indexeddb, который, скорее всего, подойдет для приложений на стороне клиента из-за:

  • Его встроенный механизм управления версиями. Клиентские приложения часто сталкиваются с фрагментацией версий, поскольку пользователи обычно не обновляются до новой версии одновременно. Так что проверять версию существующей базы данных и обновлять ее - хорошая идея.
  • Это схема без схемы, которая позволяет гибко добавлять больше данных в хранилище клиента (что часто случается по моему опыту) без необходимости обновлять базу данных до новой версии, если только вы не создаете новые индексы.
  • Он поддерживает широкий диапазон данных: основные типы, а также данные BLOB-объектов (файл, изображения)

В целом, это хороший выбор. Единственное предостережение заключается в том, что ядра хрома могут автоматически уничтожать indexeddb для восстановления дискового пространства, когда хранилище перегружено, если navigator.storage.persist не установлен, или когда на хост-машине происходит сбой, оставляя indexeddb в поврежденном состоянии.

Ответ 8

Существует множество способов сохранения данных, которые могут быть использованы в Electron, и выбор правильного подхода существенно зависит от вашего варианта использования. Если речь идет только о сохранении настроек приложения, вы можете использовать простые механизмы, такие как плоские файлы или API-интерфейсы HTML5 для хранения данных, для получения дополнительных требований к данным вы должны выбрать крупные решения для баз данных, такие как MySQL или MongoDB (с ORM или без них).

Вы можете проверить этот список методов/инструментов на сохранить данные в приложениях Electron