javascript - rapido - get data from meta tag jquery
Consulta utilizando mĂșltiples condiciones. (5)
Recientemente descubrí (lamentablemente) que WebSQL ya no es compatible con HTML5 y que IndexedDB lo reemplazará en su lugar.
Me pregunto si hay alguna forma de consultar o buscar en las entradas de un IndexedDB de manera similar a cómo puedo usar SQL para buscar una entrada que cumpla con múltiples condiciones.
He visto que puedo buscar en IndexedDB usando una condición con KeyRange. Sin embargo, parece que no puedo encontrar ninguna manera de buscar dos o más columnas de datos sin tomar todos los datos de la base de datos y hacerlo con bucles.
Sé que esta es una nueva característica que apenas se implementa en los navegadores, pero tengo un proyecto que estoy empezando y estoy investigando las diferentes maneras en que podría hacerlo.
¡Gracias!
Digamos que su consulta SQL es algo como:
SELECT * FROM TableName WHERE Column1 = ''value1'' AND Column2 = ''value2''
Consulta equivalente en la biblioteca JsStore :
var Connection = new JsStore.Instance("YourDbName");
Connection.select({
From: "YourTableName"
Where: {
Column1: ''value1'',
Column2: ''value2''
},
OnSuccess:function (results){
console.log(results);
},
OnError:function (error) {
console.log(error);
}
});
Ahora, si se está preguntando qué es JsStore, déjeme decirle que es una biblioteca para consultar IndexedDB de una manera simplificada. Haga clic aquí para obtener más información sobre JsStore
Echa un vistazo a esta respuesta a la misma pregunta. Es más detallado que la respuesta que doy aquí. El parámetro keypath para los métodos store.createIndex e IDBKeyRange puede ser una matriz . Así, ejemplo crudo:
// In onupgradeneeded
var store = db.createObjectStore(''mystore'');
store.createIndex(''myindex'', [''prop1'',''prop2''], {unique:false});
// In your query section
var transaction = db.transaction(''mystore'',''readonly'');
var store = transaction.objectStore(''mystore'');
var index = store.index(''myindex'');
// Select only those records where prop1=value1 and prop2=value2
var request = index.openCursor(IDBKeyRange.only([value1, value2]));
// Select the first matching record
var request = index.get(IDBKeyRange.only([value1, value2]));
Menciono algunas sugerencias para consultar relaciones en mi respuesta a esta pregunta, que pueden ser de interés:
Problemas conceptuales con IndexedDB (relaciones etc.)
En cuanto a la consulta de varios campos a la vez, no parece que haya una forma nativa de hacerlo en IndexedDB (podría estar equivocado; todavía soy nuevo en eso), pero ciertamente podría crear una función auxiliar que usara una cursor para cada campo, e iterado sobre ellos para ver qué registros cumplen todos los criterios.
Sí, abrir un rango de clave continuo en un índice es más o menos lo que está en indexedDB. La prueba de condición múltiple no es posible en IndexedDB. Debe hacerse en el bucle del cursor.
Si encuentras la solución, por favor házmelo saber.
Por cierto, creo que el cursor de bucle podría ser muy rápido y requerir menos memoria de lo posible con Sqlite.
Tengo un par de años de retraso, pero me gustaría señalar que la respuesta de Josh funciona con la presunción de que todas las "columnas" en la condición son parte de la keyPath
de keyPath
del índice.
Si cualquiera de dichas "columnas" existe fuera de la keyPath
de keyPath
del índice, tendrá que probar las condiciones que las involucran en cada entrada que el cursor creado en el ejemplo itera. Entonces, si estás tratando con tales consultas, o tu índice no es unique
, ¡prepárate para escribir algún código de iteración!
En cualquier caso, le sugiero que revise BakedGoods si puede representar su consulta como una expresión booleana.
Para este tipo de operaciones, siempre abrirá un cursor en el ObjectStore focal a menos que esté realizando una consulta de igualdad estricta ( x ===? y
, dado que x es una ObjectStore o una clave de índice), pero le ahorrará el problema escribiendo su propio código de iteración de cursor:
bakedGoods.getAll({
filter: "keyObj > 5 && valueObj.someProperty !== ''someValue''",
storageTypes: ["indexedDB"],
complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){}
});
Solo por el bien de la transparencia completa, BakedGoods es mantenido por moi .