2014-02-20 6 views
3

Предположим, у меня есть коллекция IndexedDB с именем items. Все детали имеют поля:IndexedDB: Получить элемент с максимальным значением

  • идентификаторов
  • имя
  • редакция

revision поле является числом. Мне нужно получить элемент с максимальным значением ревизии (или, по крайней мере, просто получить максимальное значение ревизии). Каков наилучший способ сделать это?

ответ

11

Первое, что вам нужно сделать, это создать индекс на поле revision.

Тогда вам нужна функция поиска, которая будет использовать этот индекс и открыть индекс с обратным порядком объектов. Тогда первым объектом будет объект, который вы ищете.

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

Нулевые гласит, что вы ищете для всех значений не одной конкретной, и вторым параметром является направление поиска.

Вот пример код:

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 апи является асинхронным вам потребуется функция обратного вызова для возврата значения в код.

+0

Большое спасибо !!! Я не думал об использовании направления курсора. Очень круто! – alexpods

+0

Еще один вопрос: почему бы не просто вызвать callback в openCursorRequest.onsuccess прослушиватель? Важно ли это назвать после db.close()? – alexpods

+1

Нет, Алекс, это именно то, как я использую API, поскольку большую часть времени я повторяю несколько значений с помощью события onsuccess и возвращаю значения в событии «oncomplete». В вашем случае было бы быстрее вернуть значение в событии onsuccess. –

Смежные вопросы