2012-07-15 7 views
6

Je souhaite trier les résultats obtenus avec indexedDB.
Chaque enregistrement a la structure {id, text, date} où 'id' est le chemin de clé.Tri des résultats d'une requête indexedDB

Je veux trier les résultats par date.

Mon code actuel est comme ci-dessous:

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

-Où est votre requête SQL - Désolé? , ma faute - j'ai pensé à WebSQL! – Oliver

+0

Voir http://stackoverflow.com/questions/12084177/in-indexeddb-is-there-a-way-to-make-a-sorted-compound-query/15625231#15625231 En bref, utilisez un tableau de clés comme un index. – 173210

Répondre

-4

Merci à zomg, hughfdjackson javascript irc, je triai le tableau final. Code modifié comme suit:

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

Ce genre de manque tout le point d'utiliser indexedDB. Vous voudriez utiliser un 'index' indexedDB pour trier par une propriété non-clé primaire. Vous pouvez ensuite ouvrir un curseur sur un index et parcourir de quatre façons différentes (next, prev, nextUnique, prevUnique). Votre choix de tri non natif n'est pas optimal. – Josh

+0

Cela a du sens. Merci! Je garderai cela à l'esprit quand j'utiliserai indexedDB la prochaine fois. –

+2

Cette réponse n'est pas la plus correcte. – buley

14

En fait, vous avez à indexer le champ date dans le msgs ObjectStore et ouvrir un curseur d'index sur la ObjectStore.

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

Ceci obtiendra le résultat trié. C'est ainsi que les index sont censés être utilisés.

6

Voici le moyen le plus efficace suggéré par Josh.

Supposant vous avez créé un index sur "date":

// 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.... 
    } 
}; 

En savoir plus sur la direction du curseur ici: http://www.w3.org/TR/IndexedDB/#cursor-concept

API IDBIndex est ici: http://www.w3.org/TR/IndexedDB/#idl-def-IDBIndex