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.

20
demandé sur Fong-Wan Chau 2011-08-17 03:06:53

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
    }
  };
21
répondu Fong-Wan Chau 2013-02-27 03:57:45

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.

3
répondu Oliver Nightingale 2011-08-19 09:09:42

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 par prev (c'est horrible mais c'est la solution)

IDBCursor.PREV est buggé pour le moment sur Chrome (26/02/2013)

1
répondu Arraxas 2013-02-26 14:26:38