简单存储不会在会话之间保持数据

时间:2015-06-25 21:44:15

标签: firefox-addon firefox-addon-sdk firefox-addon-restartless

我尝试使用扩展程序中的简单存储,但我无法在浏览器会话之间检索值。事情就是这样:从我的主要代码中,我以这种方式创建了一个值:

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

这没关系,我可以通过日志查看对象。但随后我关闭了浏览器,评论了" foo定义" (第2行)和控制台日志是" undefined"。

我知道cfx默认运行时每次运行都会使用一个新的配置文件,因此简单的存储不会从一次运行到下一次运行。但我正在使用

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

所以我确定我每次都使用相同的个人资料。

可能会发生什么?我错过了什么?欢迎任何想法!提前谢谢!

  

感谢Notidart的回答,我发现问题是当你以正确的方式关闭Firefox时文件被保存了。当你通过控制台杀死它时,它不会持久存储数据。

3 个答案:

答案 0 :(得分: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 ,然后是名为 simple-的文件夹存储,然后在该文件夹中名为 store.json 的文件中。示例路径:

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

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

您应该使用OS.File创建自己的文件来保存数据。 OS.FilensIFile更好,这就是简单存储所做的。将其保存在ProfD文件夹之外,但请确保在卸载插件时将其删除,否则会污染用户计算机

答案 1 :(得分:0)

如果其他人在使用jpm时发现此问题,请注意--profiledir已从jpm中移除,因此要使用相同的个人资料目录jpm run(和因此,相同的简单存储数据),您必须使用指向配置文件路径--profile选项运行它 - 而不是配置文件名称。

jpm run --profile path/to/profile

答案 2 :(得分:0)

对于未来的读者,@ Noitidart建议使用OS.File的替代方法是使用低级API io/file

您可以使用fileIO.open(path)创建文件。如果该文件不存在,则将创建该文件。您可以通过包含第二个参数fileIO.open(path, mode)来读写。

模式可以是:

  • r - 只读模式
  • w - 只写模式
  • b - 二进制模式

默认为r。您可以使用它来读取和写入文件(显然该文件不能在ProfD文件夹中,或者每次运行jpm / cfx时都会被删除)