2012-02-24 2 views
2

J'essaie de créer une application de dictionnaire sur Android. J'ai une base de données de 80000 articles. Lorsque l'utilisateur entre un mot dans un EditText, je veux montrer des suggestions dans un ListView, Pour que j'utilise le code suivant:Android SQLite recherche très lente

public Cursor query(String entry){ 
      String[] columns = new String[]{"_id", "word"}; 
      String[] selectionArgs = new String[]{entry + "%"}; 
      return mDB.query("word", columns, "word LIKE ?", selectionArgs, null, null, null); 
    } 

et j'utilise SimpleCursorAdapter pour le ListView.

Le problème est que les suggestions apparaissent très tard. Je pense que la raison est LIKE dans le SQL. Je ne connais aucun autre moyen de le faire. Y a-t-il quelque chose que je puisse faire pour améliorer la performance des suggestions?

+0

Quelle est la taille du champ de mot? –

+1

vous devriez avoir une table séparée avec des mots-clés pour chaque article et y faire vos recherches. sinon ça ne va pas aider. –

+0

@coderdem Combien de suggestions prévoient de présenter? Est-ce que ça va être une simple fonctionnalité de saisie semi-automatique? Ou avez-vous vraiment l'intention d'afficher des milliers de résultats de recherche dans la liste de résultats _suggestions_? sinon ce dernier, pourquoi ne pas utiliser _limit_? –

Répondre

3

Vous pourriez trouver que l'ajout d'un index sur la colonne word aide beaucoup. Voir the documentation.

Vous pouvez essayer cela, juste après avoir créé la table:

CREATE INDEX word_idx ON word (word); 

(Note:. Je ne sais pas si avoir la table et la colonne à la fois le nom word causera ici des problèmes de syntaxe Essayez et voir)

+0

mauvais. les index ne doivent pas être créés inconsidérément sur des champs de texte en particulier comme des articles et ainsi de suite. –

+0

Je présume que la colonne contient des mots individuels, pas des articles entiers, comme en témoigne le nom 'word'. –

+0

Le champ de mot @GrahamBorland est déjà trié. Cependant, puisqu'il contient des caractères turcs, il est trié en fonction du turc. Je ne sais pas si cela compte. – ipman

1

comme une alternative simple, vous pouvez limiter les suggestions dans l'ordre arbitraire avec Limit comme dans ce post: Using the LIMIT statement in a SQLite query

mDB.query("word", columns, "word LIKE ?", selectionArgs, null, null, null, "LIMIT 150"); 

Puisque tous les résultats sont des suggestions tout aussi valables, l'ordre n'aura pas d'importance.

De même, vous ne serez pas en mesure de montrer quantité de suggestions fou de toute façon afin que vous puissiez simplement utiliser un nombre limite fixe en fonction de votre interface utilisateur. J'ai donné comme exemple.

Hope it helps ..

1

En dehors de l'indice évident que vous devriez regarder dans la recherche en texte intégral avec MATCH plutôt que like si cela est un dictionnaire. Android devrait prendre en charge FTS3.

Découvrez http://www.sqlite.org/fts3.html et quelques réponses ici sur SO concernant fts3 sur Android.

Il semble que les mots devraient commencer par la chaîne. Peut-être ce type d'astuce pourrait aider: SQLite FTS3 simulate LIKE somestring%

+0

Je n'ai jamais entendu parler de FTS3. Je vais vérifier. – ipman

+0

C'est la recherche fulltext. Vous utilisez normalement la recherche fulltext pour les recherches de chaînes rapides dans les bases de données. –