javascript - HTML5 IndexedDB - 如何将所有记录合并为一个

标签 javascript html indexeddb savefiledialog chunks

我的想法是从服务器下载一个大文件。

  1. 存储在 IndexedDB 中的 block 。

  2. 下载所有 block 后,将所有记录合并为一个(如 SQL SELECT * FROM XXX ...)。

  3. 保存到磁盘“saveAs()”或创建指向 IndexedDB 的 URL...

(或任何想法?)

我不知道如何进行第 2 步和第 3 步

(下面是在数据库中存储 10,000 条记录的示例,步骤 2 之后的预期输出应该是 SusanSusanSusanSusanSusan...)

if (transaction) {
    transaction.oncomplete = function () {
    }
    transaction.onabort = function () {
        writeToConsoleScreen("transaction aborted.");
        localDatabase.db.close();
    }
    transaction.ontimeout = function () {
        writeToConsoleScreen("transaction timeout.");
        localDatabase.db.close();
    }
    var store = transaction.objectStore(osTableName);
    if (store) {
        var req;
        var customer = {};                   
       // create ten thousand records
       for (var loop = 0; loop < 10000; loop++) {
            customer = {};
            customer.fname = 'Susan';
            req = store.add(customer);
            req.onsuccess = function (ev) {
            }
            req.onerror = function (ev) {
                writeToConsoleScreen("Failed to add record." + "  Error: " + ev.message);
            }
        }     
    }
}

最佳答案

<!DOCTYPE html>
<script>
var open = indexedDB.open('chunks-example');
open.onupgradeneeded = function() {
  // Create schema if necessary
  var db = open.result;
  db.createObjectStore('chunks');
};

// 1. Chunks stored into an IndexedDB.
open.onsuccess = function() {
  var db = open.result;
  var tx = db.transaction('chunks', 'readwrite');
  var store = tx.objectStore('chunks');
  for (var i = 0; i < 10; ++i) {
    // For realz, this would be via
    // XMLHttpRequest.response and async.
    var chunk = new Blob(['chunk ' + i + '\n'],
      {type: 'application/octet-stream'});
    store.put(chunk, i);
  }
  tx.oncomplete = function() { merge(db); };
};

// 2. After "download" all chunks, merge all records into one
function merge(db) {
  var tx = db.transaction('chunks');
  var store = tx.objectStore('chunks');
  var chunks = [];
  var request = store.openCursor();
  request.onsuccess = function() {
    var cursor = request.result;
    if (cursor) {
      chunks.push(cursor.value);
      cursor.continue();
    } else {
      saveAs('myfile', new Blob(chunks,
        {type: 'application/octet-stream'}));
    }
  };
}

// 3. Save into disk "saveAs()"
function saveAs(filename, blob) {
  var a = document.documentElement.appendChild(document.createElement('a'));
  a.href = URL.createObjectURL(blob);
  a.download = filename;
  a.click();
  a.parentElement.remove(a);
}
</script>

关于javascript - HTML5 IndexedDB - 如何将所有记录合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24765957/

相关文章:

javascript - 在 openlayers 3 中隐藏图层或缩放功能?

javascript - 如何使用 Javascript、php 等将 html + CSS 页面转换为 pdf?

javascript - 无法在 Draft.js 中设置 editorState (它看起来不可变,但没有错误)

javascript - Styled-Components 的 .attrs() 函数的用例是什么?

javascript - 脚本标签——不链接(JS平台游戏)

javascript - IndexedDB - 数据错误 : Data provided to an operation does not meet requirements

javascript - 客户端 javascript 可以创建一个太大而无法放入内存的文件下载吗?

javascript - 如何为数组中数据表同一列中的每一行提供不同的图标

jquery - 幻灯片动画在 Firefox 中运行良好,但在 Chrome 中卡顿

Angular HttpInterceptor - 处理异步响应