gpt4 book ai didi

javascript - 如何使用户能够有效地将 indexedDB 对象存储的内容保存到文件中?

转载 作者:太空狗 更新时间:2023-10-29 13:17:12 26 4
gpt4 key购买 nike

我在 IndexedDB 中存储了大量的小对象。我想让用户能够将其中一个对象存储导出到他们可以“下载”的文件中。

我已阅读 this blog article .其中描述了读取数据、JSON.stringify 数据、使用 encodeURIComponent 对其进行编码,并将其作为链接的 href 放置用于下载数据。像这样:

var transaction = db.transaction([objectstore], "readonly");
var content = [];
var objectStore = transaction.objectStore(objectstore);

objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
content.push({key:cursor.key,value:cursor.value});
cursor.continue();
}
};

transaction.oncomplete = function(event) {
var serializedData = JSON.stringify(dataToStore);
link.attr("href",'data:Application/octet-stream,'+encodeURIComponent(serializedData));
link.trigger("click");
};

这很好,除了对象存储将有数百万条记录,而且我认为这不够高效。有没有一种方法可以更直接地允许用户将对象存储保存为文件(以一种我可以通过网页再次导入的方式)。


编辑 根据评论中的一些注释,我重写了一些它的工作原理,以便从中获得更多的好处。新代码类似于:

var transaction = db.transaction([objectstore], "readonly");
var objectStore = transaction.objectStore(objectstore);

objectStore.getAll().onsuccess = function(evt) {
var url = window.URL.createObjectURL(new Blob(evt.target.results, {'type': 'application/octet-stream'}));
link.attr('href', url);
link.trigger('click');
};

这会给我这样的结果:

  • 10k 条记录,平均导出时间 975.87ms
  • 10 万条记录,平均导出时间 5,850.10 毫秒
  • 100 万条记录,平均导出时间 56,681.00 毫秒

如您所见,导出 100 万条记录大约需要一分钟。有没有更好的方法来做到这一点? (我也尝试使用游标代替 .getAll(),但游标速度较慢)

最佳答案

IDBObjectStore.getAll不是 IndexedDB 标准的一部分,它在幕后使用游标。

Note: Mozilla has also implemented getAll() to handle this case (and getAllKeys(), which is currently hidden behind the dom.indexedDB.experimental preference in about:config). these aren't part of the IndexedDB standard, so may disappear in the future. We've included them because we think they're useful. The following code does precisely the same thing as above:

objectStore.getAll().onsuccess = function(event) {
alert("Got all customers: " + event.target.result);
};

There is a performance cost associated with looking at the value property of a cursor, because the object is created lazily. When you use getAll() for example, Gecko must create all the objects at once. If you're just interested in looking at each of the keys, for instance, it is much more efficient to use a cursor than to use getAll(). If you're trying to get an array of all the objects in an object store, though, use getAll().

获取不知道键的记录的唯一方法是使用游标。所以不,我认为没有更好的方法。但是您需要问问自己,这是否比从服务器获取记录更快。

关于javascript - 如何使用户能够有效地将 indexedDB 对象存储的内容保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14439573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com