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

Simple storage not persisting data between sessions

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

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

没关系,我可以通过日志看到对象。但后来我关闭了浏览器,评论了 "foo definition"(第 2 行),控制台日志是“undefined”。

我知道 cfx 运行 默认情况下每次 运行 都会使用一个新的配置文件,所以简单的存储不会从一个 运行 持续到下一个。但我正在使用

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

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

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

Thanks to the answer of Notidart, I could discover that the problem was the file is saved when you close Firefox in the right way. When you just kill it through console, it's not persisting data.

这就是简单存储的工作原理。它会在您的 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 的文件夹中,然后是你的 addon id,然后名为 simple-storage 的文件夹,然后位于该文件夹中名为 store.json 的文件中。示例路径:

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

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

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

以防其他人在使用 jpm 时发现此问题,请注意 --profiledir 已从 jpm 中删除,因此要使 jpm run 使用相同的配置文件目录(因此相同的 simple-storage 数据),你必须 运行 它与 --profile 选项指向配置文件 path - 而不是配置文件名称.

jpm run --profile path/to/profile

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

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

来读写

模式可以是:

  • r - Read-only 模式
  • w - Write-only 模式
  • b - 二进制模式

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