2012-07-15 12 views
6

Chcę sortować wyniki uzyskane z indexedDB.
Każdy rekord ma strukturę {identyfikator, tekst, data}, gdzie "id" to kluczowa ścieżka.Sortowanie wyników zapytania indeksowanegoDB

Chcę posortować wyniki według daty.

Mój obecny kod jest jak poniżej:

var trans = db.transaction(['msgs'], IDBTransaction.READ); 
    var store = trans.objectStore('msgs'); 

    // Get everything in the store; 
    var keyRange = IDBKeyRange.lowerBound(""); 
    var cursorRequest = store.openCursor(keyRange); 

    cursorRequest.onsuccess = function(e) { 
    var result = e.target.result; 
    if(!!result == false){ 
     return; 
    } 
    console.log(result.value); 
    result.continue(); 
    }; 
+0

-Gdzie jest zapytanie SQL - Przepraszam? , moja wina - myślałem o WebSQL! – Oliver

+0

Zobacz http://stackoverflow.com/questions/12084177/in-indexeddb-is-there-a-way-to-make-a-sorted-compound-query/15625231#15625231 Krótko mówiąc, użyj tablicy kluczy jako indeks. – 173210

Odpowiedz

-4

Dzięki zomg, hughfdjackson javascript IRC, ja klasyfikowane ostateczną tablicę. Zmodyfikowany kod jak poniżej:

var trans = db.transaction(['msgs'], IDBTransaction.READ); 
var store = trans.objectStore('msgs'); 

// Get everything in the store; 
var keyRange = IDBKeyRange.lowerBound(""); 
var cursorRequest = store.openCursor(keyRange); 

var res = new Array(); 

cursorRequest.onsuccess = function(e) { 
    var result = e.target.result; 
    if(!!result == false){ 
     **res.sort(function(a,b){return Number(a.date) - Number(b.date);});** 
     //print res etc.... 
     return; 
    } 
    res.push(result.value); 
    result.continue(); 
}; 
+7

Ten rodzaj pomija cały punkt korzystania z indexedDB. W celu posortowania według właściwości klucza nieposiadającego klucza podstawowego należy użyć indeksu indeksowanegoDB. Następnie można otworzyć kursor na indeksie i powtórzyć go na jeden z czterech sposobów (następny, poprzedni, następnyUnique, prevUnique). Twój wybór sortowania nie-natywnie nie jest optymalny. – Josh

+0

To ma sens. Dzięki! Będę o tym pamiętać, gdy następnym razem użyję indexedDB. –

+2

Ta odpowiedź nie jest najbardziej poprawna. – buley

14

Właściwie trzeba indeksu pola w msgs ObjectStore date i otworzyć kursor wskazujący na ObjectStore.

var cursorRequest = store.index('date').openCursor(null, 'next'); // or prev 

Otrzyma posortowany wynik. W ten sposób powinny być używane indeksy.

6

Oto bardziej skuteczny sposób sugerowany przez Josha.

Przypuśćmy utworzony indeks na "bieżąco":

// Use the literal "readonly" instead of IDBTransaction.READ, which is deprecated: 
var trans = db.transaction(['msgs'], "readonly"); 
var store = trans.objectStore('msgs'); 
var index = store.index('date'); 

// Get everything in the store: 
var cursorRequest = index.openCursor(); 
// It's the same as: 
// var cursorRequest = index.openCursor(null, "next"); 
// Or, if you want a "descendent ordering": 
// var cursorRequest = index.openCursor(null, "prev"); 
// Note that there's no need to define a key range if you want all the objects 

var res = new Array(); 

cursorRequest.onsuccess = function(e) { 

    var cursor = e.target.result; 
    if (cursor) { 
     res.push(cursor.value); 
     cursor.continue(); 
    } 
    else { 
     //print res etc.... 
    } 
}; 

Więcej na kierunku kursora tutaj: http://www.w3.org/TR/IndexedDB/#cursor-concept

IDBIndex API jest tutaj: http://www.w3.org/TR/IndexedDB/#idl-def-IDBIndex

Powiązane problemy