2012-07-15 71 views
6

Quiero ordenar los resultados obtenidos de indexedDB.
Cada registro tiene estructura {id, text, date} donde 'id' es keyPath.Ordenar los resultados de una consulta indexedDB

Quiero ordenar los resultados por fecha.

Mi código actual es la siguiente:

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

-¿Dónde es la consulta SQL - ¿Cómo? ¡Es mi culpa, pensé en WebSQL! – Oliver

+0

Consulte http://stackoverflow.com/questions/12084177/in-indexeddb-is-here-a-way-to-make-a-sorted-compound-query/15625231#15625231 En resumen, use una matriz de teclas como un índice. – 173210

Respuesta

-4

Gracias a zomg, hughfdjackson de JavaScript IRC, me lo solucionaron la matriz final. código modificado de la siguiente manera:

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

Este tipo de falla el punto entero de usar indexedDB. Desearía usar un 'index' indexedDB para ordenar por una propiedad que no sea de clave primaria. A continuación, puede abrir un cursor en un índice e iterar en una de cuatro formas (siguiente, anterior, siguienteÚnico, prevUnico). Su elección de ordenar de forma no nativa no es óptima. – Josh

+0

Eso tiene sentido. ¡Gracias! Lo tendré en cuenta cuando use indexedDB la próxima vez. –

+2

Esta respuesta no es la más correcta. – buley

14

En realidad, usted tiene que indexar el campo date en el msgs objectStore y abrir un cursor en el índice de objectStore.

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

Esto obtendrá el resultado ordenado. Así es como se supone que se usan los índices.

6

Esta es la forma más eficiente sugerida por Josh.

Suponiendo que ha creado un índice en "fecha":

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

más en la orientación del cursor aquí: http://www.w3.org/TR/IndexedDB/#cursor-concept

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

Cuestiones relacionadas