2013-09-27 166 views
0

我有一個已經存在的數據庫。我試圖從數據庫使用索引數據檢索數據,但我無法從數據庫中獲取數據。如何使用索引數據庫檢索數據庫中的數據

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!"); 
     } 
    };  
} 

在此先感謝。

回答

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()和「讀寫」作爲第二個參數的時使用。 (一些例子使用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) {..} 
+0

其實我試圖從數據庫獲取數據,但沒有顯示簡單的空白頁。 – Lucky

+0

您確定IDB數據庫中實際存在數據嗎? – buley

+0

是的,我的數據庫包含列Key,Subject,Category等的數據... – Lucky

0

我也遇到了同樣的錯誤一次。它會發生,因爲有時甚至在結果數據返回之前執行onSuccess。所以你應該檢查結果數據是否爲空。

要解決該問題,請嘗試使用oncomplete而不是onSuccess並使用Jquery indexedDB插件。該插件需要更改certin代碼,但具有更一致的indexedDB實現。 請參閱http://nparashuram.com/jquery-indexeddb/