Фильтрация входных данных в пользовательских функциях ContentProvider - PullRequest
4 голосов
/ 26 декабря 2010

В пользовательском ContentProvider мне нужно отфильтровать некоторые столбцы, указанные во входных данных. Учитывая тексто-ориентированные интерфейсы Android, мне трудно.

Например, ввод на MyContentProvider.query() будет фактически спрашивать что-то вроде:

SELECT column_a, column_b FROM my_table WHERE column_a=1 AND column_b=red;

Проблема в том, что на данном конкретном MyContentProvider _column_b_ может не иметь никакого смысла и не будет присутствовать в таблице. Фильтрация проекции так, чтобы остались только релевантные столбцы, может быть легко выполнена, поскольку это String []. Однако фильтрация входных данных String "where" (selection) и "selectionArgs" для этих столбцов не является тривиальной. Если все сделано правильно, это станет:

SELECT column_a FROM my_table WHERE column_a=1;

В противном случае можно получить SQLiteException "no such column".

Итак, есть ли простой способ игнорировать или фильтровать столбцы из такого оператора SQL или мне нужно пойти и написать какой-нибудь умный, хотя и очень ограниченный код синтаксического анализа регулярного выражения для части выбора?

Причина, по которой я не получаю правильные входные данные, заключается в том, что я поддерживаю пользовательский ContentProvider в качестве интерфейса для адресации, но я говорю с несколькими пользовательскими ContentProvider здесь (на заднем плане). Так или иначе, мне нужно было бы где-то отфильтровать выделение.

Обратите внимание, что я не просто спрашиваю, как выполнить запрос или использовать оператор SELECT ... WHERE. Однако это касается моей реализации функции query().

1 Ответ

0 голосов
/ 20 июля 2011

Поскольку вы расширяете свой MyContentProvider с помощью ContentProvider, почему бы вам просто не перегрузить метод query()?

Посмотрите на ContentProvider - обмен контентом с помощью ContentProvider длякто-то еще пример о том, как создать пользовательский ContentProvider.Вы должны иметь полный контроль над тем, какие данные вы выбираете из своих SQLiteDatabase.

Что еще более важно, посмотрите на аргументы, предоставленные до query(), так как они содержат информацию, которая вам нужнатаким образом, что вы можете динамически строить запрос из того, что передается в вызов метода.

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

Кроме того, всегда не забывайте очищать входные данные!

...