2012-02-24 2 views
2

Я пытаюсь создать приложение словаря на Android. У меня есть база данных из 80000 статей. Когда пользователь вводит слово в EditText, я хочу показать предложения в виде списка, чтобы сделать это я использую следующий код:Android SQLite очень медленный поиск

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); 
    } 

и я использую SimpleCursorAdapter для ListView.

Проблема в том, что предложения появляются очень поздно. Я думаю, причина в LIKE в SQL. Я не знаю другого способа сделать это. Есть ли что-то, что я могу сделать, чтобы повысить эффективность получения предложений?

+0

, насколько велика область слова? –

+1

вы должны иметь отдельную таблицу с ключевыми словами для каждой статьи и выполнять поиск там. иначе это не поможет. –

+0

@coderdem Сколько предложений планируется представить? это будет простая функция автозаполнения? Или действительно намереваются показать тысячи результатов поиска в списке результатов _suggestions_? если не последним, почему бы не использовать _limit_? –

ответ

3

Возможно, вы обнаружите, что добавление индекса в столбец word помогает. См. the documentation.

Таким образом, вы могли бы попробовать это, только после того, как вы создаете таблицу:

CREATE INDEX word_idx ON word (word); 

(Примечание:. Я не уверен, если иметь таблицу и столбец как по имени word будет вызывать проблемы синтаксиса здесь Попробуйте и см)

+0

не правильный. индексы не должны создаваться бездумно в текстовых полях, особенно в статьях и т. д. –

+0

Я предполагаю, что столбец содержит отдельные слова, а не целые статьи, о чем свидетельствует имя «слово». –

+0

Поле слова GrahamBorland уже отсортировано. Однако, поскольку он содержит турецких символов, он сортируется по турецкому. Я не знаю, имеет ли это значение. – ipman

1

в качестве простой альтернативы, вы можете ограничить предложения в произвольном порядке с Limit как в этом посте: Using the LIMIT statement in a SQLite query

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

Поскольку все результаты являются одинаково действительными предложениями, порядок не имеет значения.

Также вы можете показать сумасшедшее количество предложений в любом случае, чтобы вы могли просто использовать определенный фиксированный лимит в зависимости от вашего пользовательского интерфейса. В качестве примера я привел .

Надеется, что это помогает ..

1

Помимо очевидного индекса следует искать в использовании полнотекстового поиска с MATCH, а не like если это словарь. Android должен поддерживать FTS3.

Отъезд http://www.sqlite.org/fts3.html и некоторые ответы здесь о SO относительно fts3 на Android.

Кажется, что слова должны начинаться со строки. Возможно, этот тип фокуса мог бы помочь: SQLite FTS3 simulate LIKE somestring%

+0

Я никогда не слышал о FTS3. Я проверю. – ipman

+0

Полнотекстовый поиск. Обычно вы используете полнотекстовый поиск для быстрого поиска строк в базах данных. –

Смежные вопросы