2014-02-20 40 views
3

假設我有一個IndexedDB集合,其名稱爲items。所有項目領域:IndexedDB:檢索具有最大值的項目

  • ID
  • 修訂

revision字段是數字字段。我需要檢索一個最大修正值的項目(或者至少只是修改最大修正值)。什麼是最好的方式來做到這一點?

回答

11

您需要做的第一件事是在revision字段上創建索引。

然後,您需要一個搜索功能,該功能將使用該索引並以對象的相反順序打開索引。然後,第一個對象將是您要查找的對象。

var index = objectStore.index('revision'); 
index.openCursor(null, 'prev'); 

null表示您正在搜索的所有值不是特定的值,而第二個參數是搜索方向。

下面是示例代碼:

function getMaxNumber (callback) { 
    var openReq = indexedDB.open(baseName); 
    openReq.onsuccess = function() { 
     var db = openReq.result; 
     var transaction = db.transaction(objectStoreName, 'readonly'); 
     var objectStore = transaction.objectStore(objectStoreName); 
     var index = objectStore.index('revision'); 
     var openCursorRequest = index.openCursor(null, 'prev'); 
     var maxRevisionObject = null; 

     openCursorRequest.onsuccess = function (event) { 
      if (event.target.result) { 
       maxRevisionObject = event.target.result.value; //the object with max revision 
      } 
     }; 
     transaction.oncomplete = function (event) { 
      db.close(); 
      if(callback) //you'll need a calback function to return to your code 
       callback(maxRevisionObject); 
     }; 
    } 
} 

由於IndexedDB API是異步你需要一個回調函數值返回給你的代碼。

+0

非常感謝!我沒有考慮使用光標的方向。很酷! – alexpods

+0

還有一個問題:爲什麼不直接在openCursorRequest.onsuccess監聽器中調用回調?在db.close()之後調用它很重要嗎? – alexpods

+1

沒有Alex,這只是我使用API​​的方式,因爲大多數時候我通過'onsuccess'事件遍歷多個值並返回'oncomplete'事件中的值。在你的情況下,返回'onsuccess'事件中的值會更快。 –