1

我想从我的扩展中使用简单存储,但我无法在浏览器会话之间检索值。事情是这样的:从我的主代码,我创建了一个价值是这样的:简单的存储在会话之间不会保留数据

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在每次运行时都会使用一个新的配置文件,所以简单的存储不会从一次运行到下一次运行。但我正在使用

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; 

取得该文件的确切位置是在您的个人资料文件夹,一个名为Jetpack的文件夹中那么你插件ID,然后一个名为的文件夹简单存储,然后在该文件夹中的一个文件夹中调用store.json。示例路径:

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

然后将数据写入该文件。每当您的配置文件夹被重新创建时(由于jpm/cfx引起的临时配置文件的性质),您的数据将被删除。

您应该只使用OS.File来创建自己的文件来保存数据。 OS.File是更好的方法,然后nsIFile这就是简单存储所做的。保存该ProfD文件夹之外,所以但一定要删除它在你的插件的卸载,否则您在使用jpm污染用户计算机

+0

奇怪的是我强迫总是使用相同的配置文件,但我会用我自己的文件,并避免所有的问题:)谢谢! – gal007

+1

Cound't抵抗...我收到文件和数字,没有什么被保存!即使在执行期间!这是它永远不会存在的读取。而且,我看了一下:$ HOME/.mozilla/firefox/nightly.ext-dev/jetpack/[email protected]/simple-storage/ – gal007

+1

问题是,当您以正确方式关闭Firefox时,该文件会被保存。当你通过控制台杀死它时,它不会保留数据 – gal007

0

万一别人发现这个问题,注意--profiledirjpm删除,所以要使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时都会被删除)