1

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

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 run 默认情况下每次运行时都会使用新的配置文件,因此简单的存储不会从一次运行持续到下一次。但我正在使用

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

所以我确定我每次都使用相同的配置文件。

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

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

4

3 回答 3

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-storage的文件夹,然后是该文件夹中名为store.json的文件。示例路径:

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

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

您应该只使用OS.File创建自己的文件来保存数据。OS.File是更好的方法nsIFile,这就是 simple-storage 所做的。将其保存在该ProfD文件夹之外,因此请确保在卸载插件时将其删除,否则会污染用户计算机

于 2015-07-01T02:57:01.263 回答
0

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

jpm run --profile path/to/profile
于 2015-12-29T20:39:59.943 回答
0

对于未来的读者,@Noitidart 推荐的 using 的替代方法OS.File是使用 Low-Level APIio/file

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

模式可以是:

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

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

于 2016-01-22T10:54:39.730 回答