IndexedDB Recherche Floue
Ok, tout d'abord, désolé pour mon anglais.
je travaille dans un projet web qui montre suggère quand je tape quelque chose dans la boîte de saisie, mais je veux utiliser IndexedDB pour améliorer la vitesse de requête dans Firefox.
avec WebSQL j'ai cette phrase:
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
});
});
<!-Je veux faire la même chose avec IndexedDB et j'ai ce code:
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();
}
}
};
mais il y a trop de temps et mon code est bogué.. Je veux savoir est-il une meilleure façon de le faire ce.
Merci pour la réponse.
3 réponses
j'ai finalement trouvé la solution à ce problème.
la solution consiste à relier un intervalle de clés entre le terme de recherche et le terme de recherche par une lettre 'z' à la fin. Exemple:
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();
}
};
parce que j'ai besoin d'ordonner le résultat, donc j'ai défini un tableau avant la transaction, puis on l'appelle quand on charge toutes les données, comme ceci:
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
}
};
J'ai fait des expériences avec IndexedDB et je l'ai trouvé très lent, en plus de la complexité de son api et je ne suis pas sûr que cela vaille la peine d'être utilisé du tout.
cela dépend vraiment de la quantité de données que vous avez, mais potentiellement cela vaudrait la peine de faire la recherche dans la mémoire, et alors vous pouvez simplement marshall et un-marshall les données hors d'une sorte de stockage, soit indexedDB ou le stockage local plus simple.
j'ai perdu environ 2 heures sur le même problème et j'ai trouvé le vrai problème.
Voici la solution :
- Remplacer
IDBCursor.PREV
parprev
(c'est horrible mais c'est la solution)
IDBCursor.PREV
est buggé pour le moment sur Chrome (26/02/2013)