如何在WinJS Windows 8应用程序中正确检索IndexedDb中的所有数据?

时间:2014-11-14 00:24:51

标签: javascript windows windows-8 winjs indexeddb

我已经谷歌搜索了一段时间,并没有找到任何可以帮助我的东西。 我只是想从IndexedDB中检索所有数据。

这是我的代码到目前为止的样子:

var request = window.indexedDB.open("List", 1);
request.onsuccess = function (event) {
                db = request.result;
                console.log("success: " + db);
            };

request.onupgradeneeded = function (event) {
     db = event.target.result;
     var objectStore = db.createObjectStore("List", { keyPath: "id" });
     for (var i in parsedData) {
          objectStore.add(parsedData[i]);
     }

     console.log("RETRIEVING DATA");
     var transaction = request.transaction("List");
     var store = transaction.objectStore("List");
     store.openCursor().onsuccess = function (e) {
         var cursor = e.target.request;
         if (cursor) {
             console.log("List NAMES == " + cursor.value.Name);
         }
     }

}

现在,关于我编写的代码,需要说几件事。首先,我意识到我检索信息应该是它自己的功能(我只是这样编写它只用于打印/记录目的)。其次,由于某种原因,"检索数据"应该至少打印到日志 - 但它不会,我不知道为什么。 第三 - 最重要的是 - 我在这一行上一直收到错误:

var transaction = request.transaction("List");

错误是:JavaScript runtime error: Function expected

不确定是什么导致了我遇到的这两个问题。

2 个答案:

答案 0 :(得分:1)

  1. 只有在将version参数增加到indexedDB.open时才会调用onupgradeneeded回调。每次希望运行示例代码时,都需要增加,保存,然后重新加载。这应该导致打印RETRIEVING DATA命令。如果您没有尝试在onupgradeneeded回调函数中插入/读取数据,那么测试会容易得多。这样,每次要测试/运行代码时都不需要增加数据库版本。
  2. 您需要使用数据库对象打开事务。现在你说明var transaction = request.transaction('List');。请求是IDBRequest。我认为没有IDBRequest.prototype.transaction方法。您要使用的是IDBDatabase.prototype.transaction。例如,var transaction = db.transaction('List');
  3. 除了#2,但更复杂,您可以使用作为onupgradeneeded的一部分使用的隐式事务。这是indexedDB自动创建的特殊VERSION_CHANGE类型事务,该事务仅在onupgradeneeded回调的主体内有效。 VERSION_CHANGE txs支持读/写。如果您真的想这样做,可以使用var transaction = event.target.transaction;。我不推荐这个但是有可能。
  4. 在光标onsuccess回调中,看起来您没有将光标推进第一条记录。您需要在if块中添加cursor.continue();以继续迭代。
  5. 一个简单的示例,说明如何避免每次都必须升级数据库:

    function upgradeDatabase(event) {
      var db = event.target.result;
      db.createObjectStore('List', { keyPath: "id" });
    }
    
    function addParsedData(parsedData, callback) {
      var request = indexedDB.open('List', 1);
      request.onupgradeneeded = upgradeDatabase;
      request.onsuccess = function(event) {
        var db = event.target.result;
        var tx = db.transaction('List','readwrite');
        tx.oncomplete = callback;
        var list = tx.objectStore('List');
        for(var i in parsedData) {
          list.add(parsedData[i]);
        }
      };
    }
    
    function retrieve() {
      var request = indexedDB.open('List', 1);
      request.onupgradeneeded = upgradeDatabase;
      request.onsuccess = function(event) {
        var db = event.target.result;
        var tx = db.transaction('List');
        var list = tx.objectStore('List');
        var getAll = list.openCursor();
        var items = [];
        tx.oncomplete = function() {
          console.log('Got items %o', items);
        };
        getAll.onsuccess = function(event) {
          var cursor = event.target.result;
          if(!cursor) return;
          items.push(cursor.value);
          cursor.continue();
        };
      };
    }
    
    // This would connect, create, insert, and then select
    addParsedData(parsedData, retrieve);
    

答案 1 :(得分:0)

我不知道为什么它没有在你的事业中显示console.log。 使用上面的代码对我不起作用,因为我没有为parsedData提供的东西,当我发表评论时,我得到了日志以及你在交易中给出的错误。

该错误是因为您不应该将其称为函数。它已经是一个开放的交易,您可以这样做:request.transaction.objectStore("<Objectstore>");用于开设商店。

所以这可能无法解决您遇到的console.log问题,但它应该修复其他部分!