Я храню большое количество мелких объектов в 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');
};
Что даст мне такие результаты, как:
- 10 тыс. записей, среднее время экспорта 975,87 мс
- 100 тыс. записей, среднее время экспорта 5850,10 мс
- 1 миллион записей, среднее время экспорта 56 681,00 мс
Как видите, экспорт 1 миллиона записей занимает около минуты. Есть ли лучший способ сделать это? (Я также пытался использовать курсор вместо .getAll()
, но курсоры работают медленнее)
window.URL.createObjectURL(new Blob(contents, {'type': MIME_TYPE}))
должно быть в порядке. - person Kyaw Tun   schedule 21.01.2013window.URL.createObjectURL(new Blob());
, который может ответить на мой вопрос, поскольку он кажется примерно в два раза быстрее, чем при использовании методаencodeURI
. ранние скамейки говорят о 6 секундах для 100k записей. - person Chad   schedule 21.01.2013encodeURI
, но все же довольно медленно... - person Chad   schedule 21.01.2013ArrayBuffer
. - person Kyaw Tun   schedule 22.01.2013