Главная » Разработка для Android » Реакция на поисковые запросы из Источника данных

0

Активность, описанная в предыдущем разделе, может быть использова- на как для выполнения поиска, так и для вывода поисковых  результатов в приложении. Чтобы получить информацию для вывода ее на экран, нужно создать (или  изменить) Источник данных, который будет обрабатывать  по- исковые запросы и возвращать  результаты.

Чтобы воспользоваться поисковым  фреймворком Android, вашему Ис- точнику данных необходимо поддерживать специфические пути URI. В ли- стинге 10.21 показан объект UriMatcher, который сравнивает  запрашивае- мый путь с известными поисковыми запросами,  представленными в виде значений  URI.

Листинг 10.21. Распознавание поисковых  запросов в Источнике данных

private static int SEARCH = 1;

static {

uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

uriMatcher.addURI("com.paad.provider.earthquake", "earthquakes", QUAKES);

uriMatcher.addURI("com.paad.provider.earthquake", "earthquakes/#", QUAKE_ID);

uriMatcher.addURI("com.paad.provider.earthquake", SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH);

uriMatcher.addURI("com.paad.provider.earthquake", SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH);

uriMatcher.addURI("com.paad.provider.earthquake",

SearchManager.SUGGEST_URI_PATH_SHORTCUT, SEARCH);

uriMatcher.addURI("com.paad.provider.earthquake", SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*", SEARCH);

}

Используйте этот же шаблон URI внутри Источника данных, чтобы воз- вращать соответствующие типы MIME для поисковых запросов, как по- казано в листинге  10.22. Результаты поиска должны возвращаться в виде SearchManager.SUGGEST_MIME_TYPE, чтобы поддерживать подсказки во время ввода.

Листинг 10.22. Возвращение корректного типа MIME  для результатов поиска

@Override

public String getType(Uri uri) {

switch (uriMatcher.match(uri)) {

case QUAKES : return "vnd.android.cursor.dir/vnd.paad.earthquake"; case QUAKE_ID: return "vnd.android.cursor.item/vnd.paad.earthquake"; case SEARCH : return SearchManager.SUGGEST_MIME_TYPE;

default: throw new IllegalArgumentException("Unsupported URI: " + uri);

}

}

Объект  UriMatcher также может быть применен  внутри  метода query. Если фиксируется входящий  поисковый  запрос, вы можете получить  его условия, изучив последний  сегмент запрашиваемого пути URI.

uri.getPathSegments().get(1);

Чтобы вернуть результаты поиска, которые могут быть выведены с по- мощью поискового фреймворка Android, нужно создать и применить  про- екцию, приводящую имена столбцов  в формат,  поддерживаемый объек- том SearchManager. Этот объект включает  статические  константы  вида SUGGEST_COLUMN_*, которые могут использоваться в проекции.

Два столбца обязательны:  SUGGEST_COLUMN_TEXT_1 — показы- вает текст результата поиска, и id_ — хранит уникальный идентификатор строки.

В листинге 10.23 показан каркас для создания и применения проекции внутри запроса, он возвращает  объект Cursor, соответствующий результа- там поиска.

Листинг 10.23. Возвращение результатов поиска из метода query

private static final HashMap<String, String> SEARCH_PROJECTION_MAP;

static {

SEARCH_PROJECTION_MAP = new HashMap<String, String>(); SEARCH_PROJECTION_MAP.put(SearchManager.SUGGEST_COLUMN_TEXT_1,

KEY_SEARCH_COLUMN + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_1);

Продолжение ?

Листинг 10.23 (продолжение)

SEARCH_PROJECTION_MAP.put("_id", KEY_ID + " AS " + "_id");

}

@Override

public Cursor query(Uri uri, String[] projection, String selection, String[]

selectionArgs, String sort) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(MY_TABLE);

switch (uriMatcher.match(uri)) {

case SINGLE_ID:

qb.appendWhere(KEY_ID + "=" + uri.getPathSegments().get(1));

break;

case SEARCH  : qb.appendWhere(KEY_SEARCH_COLUMN + " LIKE \"%" +

uri.getPathSegments().get(1) + "%\"");

qb.setProjectionMap(SEARCH_PROJECTION_MAP);

break;

default      : break;

}

Cursor c = qb.query(MyDB, projection,

selection, selectionArgs,

null, null, orderBy);

return c;

}

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии