【问题标题】:Simple storage not persisting data between sessions简单存储不会在会话之间保留数据
【发布时间】:2023-03-23 10:44:01
【问题描述】:

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

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时文件被保存了。当你只是通过控制台杀死它时,它不会持久化数据。

【问题讨论】:

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


【解决方案1】:

这就是简单存储的工作原理。它会在您的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.FilensIFile 更好,这就是 simple-storage 所做的。将其保存在 ProfD 文件夹之外,因此请确保在卸载插件时将其删除,否则会污染用户计算机

【讨论】:

  • 奇怪的是我总是强制使用相同的配置文件,但我会使用我自己的文件并避免所有问题 :) 谢谢!
  • 无法抗拒...我阅读了文件并发现没有任何内容被保存!即使在执行期间!那就是它永远不会持续的阅读。是的,我查看了:$HOME/.mozilla/firefox/nightly.ext-dev/jetpack/jid1-8RskSx1RnMDgug@jetpack/simple-storage/
  • 问题是,当您以正确的方式关闭 Firefox 时,文件会被保存。当你只是通过控制台杀死它时,它不会持久化数据
  • 非常有趣的分享,如果不正确关闭不保存。他们应该有备用方法来处理它。让我们提交一个错误,您知道如何在bugzilla.mozilla.org 上执行此操作吗?
【解决方案2】:

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

jpm run --profile path/to/profile

【讨论】:

    【解决方案3】:

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

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

    模式可以是:

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2022-01-28
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多