3
假設我有一個IndexedDB
集合,其名稱爲items
。所有項目領域:IndexedDB:檢索具有最大值的項目
- ID
- 名
- 修訂
revision
字段是數字字段。我需要檢索一個最大修正值的項目(或者至少只是修改最大修正值)。什麼是最好的方式來做到這一點?
假設我有一個IndexedDB
集合,其名稱爲items
。所有項目領域:IndexedDB:檢索具有最大值的項目
revision
字段是數字字段。我需要檢索一個最大修正值的項目(或者至少只是修改最大修正值)。什麼是最好的方式來做到這一點?
您需要做的第一件事是在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是異步你需要一個回調函數值返回給你的代碼。
非常感謝!我沒有考慮使用光標的方向。很酷! – alexpods
還有一個問題:爲什麼不直接在openCursorRequest.onsuccess監聽器中調用回調?在db.close()之後調用它很重要嗎? – alexpods
沒有Alex,這只是我使用API的方式,因爲大多數時候我通過'onsuccess'事件遍歷多個值並返回'oncomplete'事件中的值。在你的情況下,返回'onsuccess'事件中的值會更快。 –