chrome.storage.sync vs chrome.storage.local

时间:2014-03-25 13:56:40

标签: google-chrome google-chrome-extension

我试图了解如何使用chrome.storage.api。 我在manifest.json

中加入了以下内容
"permissions": [
"activeTab","storage"
],

然后,我用devtools打开了一个新选项卡,并将<page context>切换到我的chrome扩展名。比我打字:

chrome.storage.sync.set({"foo":"bar"},function(){ console.log("saved ok"); } );

得到了:

undefined
saved ok 

我尝试获取此存储值:

chrome.storage.sync.get("foo",function(data){ console.log(data); } );

但是这让我:

undefined
Object {} 

比我做的一样,但我使用sync而不是local,而且按预期工作:

chrome.storage.local.set({"foo":"bar"},function(){ console.log("saved ok"); } );

..和检索:

chrome.storage.local.get("foo",function(data){ console.log(data); } );

这让我:Object {foo: "bar"}应该如此。

这是因为我没有登录我的Chrome帐户吗?但在这种情况下,isn&t [{1}}是否会设法回退到本地存储数据?

修改

奇怪的是,当我在控制台上直接键入它时,似乎工作正常,但此代码并不是从单击侦听器中的background.js代码运行的:

chrome.storage.sync

运行此操作后,var dataCache = {}; function addStarredPost(post) { var id = getPostId(post); var timeStamp = new Date().getTime(); var user = getUserName(); dataCache[id] = {"id":id,"post":post,"time":timeStamp,"user":user}; chrome.storage.sync.set(dataCache,function(){ console.log("Starred!");}); } 将返回一个空对象,就好像数据未存储一样。 :/ 这段代码似乎与chrome.storage.sync.get(null,function(data){ console.log(data); });完美配合。

chrome.storage.local返回chrome.runtime.lastErros

2 个答案:

答案 0 :(得分:11)

chrome本地存储的最大大小为5,242,880字节。 要扩展存储,可以在manifest.json上添加:

"permissions": [
  "unlimitedStorage"
]

Chrome同步存储的最大尺寸为:

  • 总共102,​​400字节
  • 每件8,192字节
  • 最多512件
  • 每小时1,800次写作操作
  • 每分钟120次操作

source

答案 1 :(得分:4)

糟糕!

问题是我试图同步超出大小的数据。 (每项4096字节)

我没有得到chrome.runtime.lastError,因为我错误地将它放在get函数范围内,而不是产生错误的set函数。因此,我发布这个答案,这可能会帮助那些同样困惑的人。

您应该在每次api通话中检查chrome.runtime.lastError,如下所示:

chrome.storage.local.set(objectToStore, function(data)
{
   if(chrome.runtime.lastError)
   {
       /* error */
       console.log(chrome.runtime.lastError.message);
       return;
   }
  //all good. do your thing..
}

这与chrome.storage.local一起运行正常,因为according to the docs您只有sync这个限制。

打印chrome.runtime.lastError给了我:Object {message: "QUOTA_BYTES_PER_ITEM quota exceeded"}