Cha*_*had 10 javascript html5 indexeddb
我在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");
};
Run Code Online (Sandbox Code Playgroud)
这很好,除了对象存储将有数百万条记录,我不觉得这将足够高性能.有没有办法更直接地允许用户将对象存储作为文件保存(以我可以通过网页再次导入的方式).
编辑从评论中的一些注释我重写了一些如何工作,以便从中获得更多的果汁.新代码类似于:
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');
};
Run Code Online (Sandbox Code Playgroud)
哪个会给我结果如下:
正如您所看到的,100万条记录需要大约一分钟才能导出.有没有更好的方法来做这件事?(我也试过用光标代替.getAll(),但游标速度较慢)
IDBObjectStore.getAll不是 IndexedDB 标准的一部分,它在幕后使用游标。
注意:Mozilla 还实现了 getAll() 来处理这种情况(以及 getAllKeys(),目前隐藏在 about:config 中的 dom.indexedDB.experimental 首选项后面)。这些不是 IndexedDB 标准的一部分,因此将来可能会消失。我们将它们包括在内是因为我们认为它们很有用。以下代码执行与上面完全相同的操作:
Run Code Online (Sandbox Code Playgroud)objectStore.getAll().onsuccess = function(event) { alert("Got all customers: " + event.target.result); };查看游标的 value 属性会产生性能成本,因为该对象是延迟创建的。例如,当您使用 getAll() 时,Gecko 必须立即创建所有对象。例如,如果您只是想查看每个键,那么使用游标比使用 getAll() 更有效。但是,如果您尝试获取对象存储中所有对象的数组,请使用 getAll()。
获取您不知道键的记录的唯一方法是使用游标。所以不,我认为没有更好的方法。但您需要问自己这是否比从服务器获取记录更快。
| 归档时间: |
|
| 查看次数: |
3225 次 |
| 最近记录: |