Я могу добавить два совета, если кто-то еще не сможет это сделать. В файле Manifest.xml убедитесь, что активность хостинга не завершилась при обратном вызове, и для запуска активности в качестве стандартного режима запуска. См. Подробности, как показано ниже:
Для активности хостинга установите свойство no history как false, если у вас есть
android:noHistory="false"
. Для запуска операции установите режим запуска в качестве стандарта, если у вас
android:launchMode="standard"
У меня была потребность сделать это на одном из моих недавних проектов. Вот схема, которую я использую для генерации SQL:
Это все еще немного сложно, но в конце Вы знаете, где поколение SQL для каждой отдельной части запроса происходит (и я не думаю, что существуют любые большие операторы переключения). И не забывайте использовать StringBuilder.
Вы могли попробовать подход, используемый инструментами генерации кода как CodeSmith. Создайте шаблон SQL с заполнителями. Во времени выполнения считайте шаблон в строку и замените заполнителями с фактическими значениями. Это только полезно, если весь код SQL следует за шаблоном.
Мы создали наш собственный объект FilterCriteria, который является своего рода черным ящиком динамический конструктор запросов. Это имеет свойства набора для SelectClause, WhereClause, GroupByClause и OrderByClause. Это также содержит свойства для CommandText, CommandType и MaximumRecords.
Мы затем выступаем, передают наш объект FilterCriteria нашей логике данных, и это выполняет его против сервера базы данных и передает значения параметров хранимой процедуре, которая выполняет динамический код.
Работы хорошо для нас... и сохраняют поколение SQL приятно содержавшимся в объекте.
Из любопытства имейте Вас, рассмотрел использование ORM для управления Вашим доступом к данным. Большая функциональность, которую Вы пытаетесь реализовать, могла уже быть там. Это может быть что-то для взгляда на потому что его лучшее для не изобретения велосипед.
Обычно это - что-то вроде этого:
string query= "SELECT {0} FROM .... WHERE {1}"
StringBuilder selectclause = new StringBuilder();
StringBuilder wherecaluse = new StringBuilder();
// .... the logic here will vary greatly depending on what your system looks like
MySqlcommand.CommandText = String.Format(query, selectclause.ToString(), whereclause.ToString());
Я также просто начинаю с ORMs. Вы могли бы хотеть смотреть на одного из тех. ActiveRecord / В спящем режиме, некоторые хорошие ключевые слова к Google.
Gulzar и Ryan Lanciaux делают правильные замечания в упоминании CodeSmith и ORM. Или тех мог бы уменьшить или устранить Вашу текущую нагрузку когда дело доходит до генерации динамического SQL. Ваш текущий подход использования параметризованного SQL мудр, просто потому что это защищает хорошо от атак с использованием кода на SQL.
Без фактического примера кода для комментария трудно обеспечить информированную альтернативу циклам и операторам переключения, которые Вы в настоящее время используете. Но так как Вы упоминаете установку свойства CommandText я рекомендовал бы использование строки. Формат в Вашей реализации (если Вы уже не используете его). Я думаю, что это может сделать Ваш код легче реструктурировать, и поэтому улучшить удобочитаемость и понимание.
Если действительно необходимо сделать это из кода, то ORM является, вероятно, способом пойти, чтобы попытаться содержать его в чистоте.
Но я хотел бы предложить альтернативу, которая работает хорошо и могла избежать проблем производительности, которые сопровождают динамические запросы, из-за изменения SQL, который требует, чтобы новые планы запросов были созданы с различными требованиями к индексам.
Создайте хранимую процедуру, которая принимает все возможные параметры, и затем используйте что-то вроде этого в где пункт:
where...
and (@MyParam5 is null or @MyParam5 = Col5)
затем, из кода, намного более просто установить значение параметра на DBNull. Значение, когда это не применимо, вместо того, чтобы менять струну SQL, Вы генерируете.
Ваш DBAs будет намного более доволен Вами, потому что у них будет одно место для движения для оптимизации запросов, SQL будет легко считать, и они не должны будут рыть через трассировки профилировщика для нахождения многих различных запросов, сгенерированных кодом.
ORMs уже решили проблему динамического поколения SQL (я предпочитаю NHibernate/ActiveRecord). Используя эти инструменты можно создать запрос с неизвестным количеством условий цикличным выполнением через ввод данных пользователем и генерацией массива объектов Выражения. Затем выполните встроенные методы запроса, с которыми пользовательское выражение установило.
List<Expression> expressions = new List<Expression>(userConditions.Count);
foreach(Condition c in userConditions)
{
expressions.Add(Expression.Eq(c.Field, c.Value));
}
SomeTable[] records = SomeTable.Find(expressions);
Существует больше опций 'Expression': неравенство, больше/меньшее количество, чем, null/not-null, и т.д. Тип 'Условия', который я просто составил, можно, вероятно, наполнить ввод данных пользователем в полезный класс.