Рекомендации по обращению с поиском

У меня есть настройка SearchView, и у меня есть свободно развязанная архитектура с использованием Retrofit и Otto.

Мне интересно, что Best Practices для поиска в Android или любое мобильное приложение вообще (что-то вроде этого может быть применено и к iOS).

В частности, я использую AutoCompleteTextView для обработки предложений в моем SearchView, и данные поступают прямо из API. Я не считаю, что это лучшая практика, поскольку каждый раз, когда пользователь меняет текст в SearchView, инициируется вызов API.

Я подумываю о хранении кеша в SQLite, а затем отсканировании результатов, но что, если пользователь хочет получить самые непосредственные данные? Как бы вы справились с этим? Какой шаблон будет использовать?

Порадуем любые мысли о лучшей архитектуре или подходе к поиску в Android.

Ответ 1

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

Сначала нам нужно задать несколько вопросов относительно того, как мы будем решать эту проблему:

  • Есть ли автозаполнение?
  • Какова область поиска?
  • Будет ли кеширование?

И еще много вопросов.

Я бы, вероятно, сначала создал пользовательский адаптер для обработки запросов в поиске, а затем реализовал агрессивное кэширование в пользовательских запросах. Это важно в том смысле, что пользовательские запросы очень важны. Вероятно, было бы целесообразно использовать только кешированные результаты для Autocomplete, очень дорого реализовать автозаполнение и заставить его пинговать сервер при каждом изменении текста.

Кэширование может быть выполнено с помощью помощников SQLite в Android. Это может быть дорогостоящим, но мы имеем дело с простыми объектами запроса (как это должно быть в случае с API, объекты должны иметь размер памяти или размер байта).

Ответ 2

Я думаю, что нет смысла делать вызов API до того, как пользователь перестанет печатать. Итак, вы можете положить задержку, скажем, 500 мс. Когда пользователь перестает печатать, после 500 мс вы вызываете вызов API и показываете результаты.

Вы можете использовать метод Handler postDelayed для планирования вызовов API поиска. Вы можете использовать Handler для управления очередью сообщений. Вы отправляете задержанный Runnable каждый раз, когда пользователь вводит символ и отменяет предыдущие сообщения. Это будет выглядеть так:

public void onTextChanged(CharSequence s, int start, int before, int count) {
    handler.removeCallbacks(searchRunnable);
    handler.postDelayed(searchRunnable, 500);
}

Ответ 3

  • сначала вам нужно сделать столбец индексом, который является атрибутом поиска.
  • вам нужно сохранить только этот столбец в базе данных sqlite. Он использовал для выбора параметров из вашей таблицы, когда пользователь производит поиск.
  • то вы вызываете api для результата поиска, после слова, выбранного в строке поиска.