如何使用索引数据库从数据库中检索数据

时间:2013-09-27 06:50:20

标签: html5 indexeddb

我有一个现有的数据库。我正在尝试使用indexedDB从数据库中检索数据,但我无法从数据库中获取数据。

 var data = [];
    // creating or opening the database
    var db;
    var request = window.indexedDB.open("database");

    request.onerror = function(event) {
      console.log("error: ");
    };

    request.onsuccess = function(event) {
      db = request.result;
      console.log("success: "+ db);
    };

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


function readAll() {
    var objectStore = db.transaction("Subject").objectStore("Subject");
    console.log(objectStore);
    objectStore.openCursor().onsuccess = function(event) {
      var cursor = event.target.result;
      if (cursor) {
            alert("Name for id " + cursor.key + " is " + cursor.value.Subject);
            cursor.continue();
      }
      else {
            alert("No more entries!");
      }
    };      
}

先谢谢。

2 个答案:

答案 0 :(得分:1)

你非常接近。

var data = [];

我会假设你确实在某个地方有一些数据,而且它确实有一个id属性,因为你将它指定为索引键,例如。

var data = [{id: 'foo' }, { id: 'bar' } ];

现在这里:

var objectStore = db.createObjectStore("Subject", {keyPath: "id"});
for (var i in data) {
        objectStore.add(data[i]);       
}

Carefulfor..in和数组)

我认为你实际上并没有在这里添加任何数据,这是你无法阅读的原因之一。要将数据添加到对象库,请先尝试创建一个读/写事务,然后获取对象库的引用并添加对象。

var trans = db.transaction(["Subject"], "readwrite").objectStore("Subject");

注意使用数组作为transaction()的第一个参数,将“readwrite”作为第二个参数。 (某些示例使用IDBTransaction.READ_WRITE常量,但这似乎不适用于最新版本的Webkit。)

var objectStore = db.transaction("Subject").objectStore("Subject");

请改为尝试:

var trans = db.transaction( [ "Subject" ] );
  , objectStore = trans.objectStore( "Subject" );
objectStore.openCursor( IDBKeyRange.lowerBound(0) ).onsuccess = function(event) {..}

答案 1 :(得分:0)

我确实遇到过同样的错误一次。这是因为有时甚至在返回结果数据之前执行onSuccess。所以你应该检查结果数据是否为空。

要解决此问题,请尝试使用oncomplete而不是onSuccess,并使用Jquery indexedDB插件。该插件需要certin代码更改,但indexedDB的实现更加一致。 见http://nparashuram.com/jquery-indexeddb/