javascript - localstorage - indexeddb vs websql
IndexedDB Búsqueda difusa (3)
Finalmente encontré la solución a este problema.
La solución consiste en unir un rango clave entre el término de búsqueda y el término de búsqueda con una letra ''z'' en la final. Ejemplo:
db.transaction([''table''], ''readonly'')
.objectStore(''table'')
.openCursor(
IDBKeyRange.bound(searchTerm, searchTerm + ''/uffff''), // The important part, thank Velmont to point out
''prev'')
.onsuccess = function (e) {
e || (e = event);
var cursor = e.target.result;
if (cursor) {
// console.log(cursor.value.column1 + '' = '' + cursor.value.column2);
cursor.continue();
}
};
Debido a que necesito ordenar el resultado, así que definí una matriz antes de la transacción, luego la llamamos cuando cargamos todos los datos, de esta manera:
var result = [];
db.transaction([''table''], ''readonly'')
.objectStore(''table'')
.openCursor(
IDBKeyRange.bound(searchTerm, searchTerm + ''/uffff''), // The important part, thank Velmont to point out
''prev'')
.onsuccess = function (e) {
e || (e = event);
var cursor = e.target.result;
if (cursor) {
result.push([cursor.value.column1, cursor.value.sortcolumn]);
cursor.continue();
} else {
if (result.length) {
result.sort(function (a, b) {
return a[1] - b[2];
});
}
// Process code here
}
};
Ok, primero que nada, perdón por mi inglés.
Estoy trabajando en un proyecto web que el programa sugiere cuando escribo algo en el cuadro de entrada, pero quiero usar IndexedDB para mejorar la velocidad de consulta en Firefox.
Con WebSQL tengo esta frase:
db.transaction(function (tx) {
var SQL = ''SELECT "column1",
"column2"
FROM "table"
WHERE "column1" LIKE ?
ORDER BY "sortcolumn" DESC
LIMIT 6'';
tx.executeSql(SQL, [searchTerm + ''%''], function(tx, rs) {
// Process code here
});
});
Quiero hacer lo mismo con IndexedDB y tengo este código:
db.transaction([''table''], ''readonly'')
.objectStore(''table'')
.index(''sortcolumn'')
.openCursor(null, ''prev'')
.onsuccess = function (e) {
e || (e = event);
var cursor = e.target.result;
if (cursor) {
if (cursor.value.column1.substr(0, searchTerm.length) == searchTerm) {
// Process code here
} else {
cursor.continue();
}
}
};
Pero hay demasiado lento y mi código está defectuoso. Quiero saber si hay una mejor manera de hacerlo.
Gracias por la respuesta.
He estado experimentando con IndexedDB y lo encontré muy lento, lo que se agregó a la complejidad de su api y no estoy seguro de que valga la pena usarlo.
Realmente depende de la cantidad de datos que tenga, pero potencialmente valdría la pena hacer la búsqueda en la memoria, y luego puede reunir y desmarcar los datos de algún tipo de almacenamiento, ya sea indexedDB o el almacenamiento local más simple.
He perdido ~ 2 horas en el mismo problema y he encontrado el problema real.
Aquí la solución:
- Reemplace
IDBCursor.PREV
porprev
(es horrible pero esta es la solución)
IDBCursor.PREV
está IDBCursor.PREV
en este momento en Chrome (26/02/2013)