1

Я пытаюсь использовать simpleestorage из моего расширения, но я не могу получить значения между сеансами браузера. Вот что: Из моего основного кода, я создал значение, таким образом:Простая память, не сохраняющая данные между сеансами

var ss = require("sdk/simple-storage"); 
ss.storage.foo = [{id:"bar1", properties:{a:"aaa", b:"bbb"}}] 
console.log(ss.storage.foo); 

Это нормально, я coud увидеть объект через бревно. Но затем я закрыл браузер, прокомментировал определение «foo» (строка 2), а журнал консоли «undefined».

Я знаю, что cfx run по умолчанию использует новый профиль каждый раз, когда он запускается, поэтому простое хранилище не будет сохраняться с одного запуска на другой. Но я использую

cfx -b firefox run --profiledir=$HOME/.mozilla/firefox/nightly.ext-dev 

Так что я уверен, что каждый раз использую тот же профиль.

Что может случиться? Что мне не хватает? Любая идея приветствуется! Заранее спасибо!

Благодаря ответу Notidart я обнаружил, что проблема заключается в сохранении файла при закрытии Firefox в правильном направлении. Когда вы просто убиваете его через консоль, это не сохраняется.

+0

Я помню, что вы работали над дополнениями firefox для мобильных и настольных компьютеров, у вас есть совет по этому вопросу здесь: http://stackoverflow.com/q/31041439/1828637 – Noitidart

ответ

2

Это то, как работает простое хранилище. Это создает папку в папке ProfD, которая является ваш каталог профиля: https://github.com/mozilla/addon-sdk/blob/master/lib/sdk/simple-storage.js#L188

let storeFile = Cc["@mozilla.org/file/directory_service;1"]. 
       getService(Ci.nsIProperties). 
       get("ProfD", Ci.nsIFile); 
storeFile.append(JETPACK_DIR_BASENAME); 
storeFile.append(jpSelf.id); 
storeFile.append("simple-storage"); 
file.mkpath(storeFile.path); 
storeFile.append("store.json"); 
return storeFile.path; 

Точное местоположение файла, сделанного находится в папке профиля, в папке с именем Реактивный ранец тогда ваш аддон идентификатор, затем папку с именем simple-storage, затем в файл в этой папке под названием store.json. Пример:

ProfD/jetpack/addon-id/simple-storage/store.json 

Затем он записывает данные в этот файл. Каждый раз, когда ваша папка профиля воссоздается (из-за характера временного профиля, из-за jpm/cfx), ваши данные стираются.

Вы должны просто использовать OS.File, чтобы создать свой собственный файл для сохранения данных. OS.File лучше, чем nsIFile, что и есть, простое хранилище. Сохраните его за пределами этого ProfD папки, так, но не забудьте удалить его при удалении вашего аддона иначе загрязняют пользователь компьютеры

+0

Странно то, что я заставляю использовать всегда тот же профиль, но я буду использовать свой собственный файл и избежать всех проблем :) Спасибо! – gal007

+1

Cound't resist ... Я прочитал файл и цифры, что ничего не спасает! Даже во время исполнения! это то, что он никогда не сохраняется. И да, я заглянул: $ HOME/.mozilla/firefox/nightly.ext-dev/jetpack/[email protected]/simple-storage/ – gal007

+1

Проблема была в том, что файл сохраняется при правильном закрытии Firefox , Когда вы просто убиваете его через консоль, не сохраняются данные. – gal007

0

Только в случае, если кто-то находит этот вопрос при использовании jpm, обратите внимание, что --profiledir удаляются из jpm, так чтобы сделать jpm run, используя тот же каталог профиля (и тем самым одни и те же данные простого хранения), вы должны запустить его с опцией --profile, указывающей на профиль путь - не имя профиля.

jpm run --profile path/to/profile 
0

Для будущих читателей, альтернатива @ рекомендации Noitidart в использовании OS.File, заключается в использовании низкоуровневого API io/file

Вы можете создать файл с помощью fileIO.open(path). Если файл не существует, он будет создан. Вы можете читать и писать, включив второй аргумент fileIO.open(path, mode).

Режим может быть:

  • r - только для чтения режим
  • w - только для записи режим
  • b - Двоичный режим

По умолчанию это значение r. Вы можете использовать это для чтения и записи в файл (очевидно, файл не может находиться в папке ProfD или он будет удаляться при каждом запуске jpm/cfx)