Уточнение результатов существующего поискового запроса в Android - PullRequest
2 голосов
/ 29 сентября 2011

В моем приложении для Android я хочу выполнить запрос к поставщику контента, а затем уточнить этот поиск (у меня есть две строки предложения WHERE). Записи, которые должны быть возвращены вторым запросом, являются подмножеством строк, возвращаемых первым запросом.

Мое текущее решение выглядит так:

Cursor cursor1 = query (myUri, myProjection, where1, null, null);  
//do stuff  
Cursor cursor2 = query (myUri, myProjection, where2, null, null);  
//do other stuff  

Если я сделаю это, второй запуск запроса будет совсем неэффективным (он ищет всю базу данных, как и первый). Я хотел бы, чтобы второй запрос выполнялся только для строк, которые возвращаются в cursor1. Можно ли это сделать и как?

В документации Android указано, что запросы могут кэшироваться, если я использую ту же (параметризованную) строку, где и другие параметры. Может ли это быть полезным или есть совершенно другой способ сделать это?

1 Ответ

1 голос
/ 29 сентября 2011

Проверка CursorAdapter .Он реализует интерфейс Filterable и содержит несколько интересных методов: setFilterQueryProvider и getFilterQueryProvider.Я не использовал CursorAdapter, но если он похож на другие адаптеры (или пользовательские адаптеры, реализующие Filterable), то это именно то, что вам нужно.

UPDATE Вот пример: http://www.outofwhatbox.com/blog/2010/11/android-simpler-autocompletetextview-with-simplecursoradapter/

Интересующая вас часть выглядит следующим образом:

adapter.setFilterQueryProvider(new FilterQueryProvider() {
        public Cursor runQuery(CharSequence constraint) {
            // Search for states whose names begin with the specified letters.
            Cursor cursor = mDbHelper.getMatchingStates(
                    (constraint != null ? constraint.toString() : null));
            return cursor;
        }
    });

Когда он возвращает новый экземпляр Cursor, я предполагаю, что он снова попадает в DB.Вы можете реализовать свою собственную логику поиска, перебирая курсор и ища совпадения.Вам нужно будет написать какой-нибудь тест, чтобы понять, стоит ли избегать попадания в базу данных с помощью нового запроса, так как при ручной итерации курсора вы будете сталкиваться с базой сильнее.Помните, что вы на самом деле не извлекаете данные (строку / запись) из БД, если вы явно не запрашиваете их (вызывая любую функцию readXXX () для курсора).

Кстати, вас может заинтересовать ORMLite

...