我在 IndexedDB 中存储了大量的小对象。我想让用户能够将其中一个对象存储导出到他们可以“下载”的文件中。
我已经阅读了这篇博客文章。其中描述了读取数据、读取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 平均导出时间
- 100k 条记录,5,850.10ms 平均导出时间
- 100 万条记录,平均导出时间为 56,681.00 毫秒
如您所见,导出 100 万条记录大约需要一分钟。有没有更好的方法来做到这一点?(我也尝试使用游标代替.getAll()
,但游标速度较慢)