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

0

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

1. Создание предложения SQL, описывающего данные, которые вам требуется получить.

2. Применение этого предложения к базе данных.

3. Отображение результирующих данных SQL на такие структуры данных, которые будут понятны языку, с которым вы работаете.

Этот процесс может быть очень сложен при применении специальных программ объектно-реляционного отображения или относительно прост, но трудоемок при написании запросов внутри вашего приложения. Инструменты для объектно-реляционного отображения (object relational mapping, ORM, http://ru.wikipedia.org/wiki/ ORM) защищают код от сложностей, связанных с программированием баз данных и отображением (ассоциированием) объектов. Эти проблемы не исчезают, а просто не отвлекают вас от работы. Вы можете достичь большей отказоустойчивости кода в том, что касается изменений базы данных, но для этого придется произвести сложную настройку объектно-реляционного отображения, а затем заниматься поддержкой этой системы. В настоящее время объектно-реляционное отображение в программах Android, как правило, не применяется.

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

Обычный компромиссный подход заключается в том, что вся логика базы данных извлекается в множество объектов, единственная цель которых – преобразовывать запросы приложения в запросы к базе данных и отправлять полученные результаты обратно в приложение. Именно такой подход мы применили в приложении MJAndroid. Весь код базы данных содержится в одном классе Mi croJobsDatabase, который также дополняет SQLiteOpenHelper. Но с применением поставщика содержимого SimpleFinchVideoContentProvider база данных остается достаточно простой и нам не приходится прибегать к использованию внешних строк.

Android позволяет модифицировать курсоры, если они не применяются с поставщиками содержимого. Мы обязательно воспользуемся этой возможностью, чтобы еще сильнее уменьшить зависимости кода и скрыть всю информацию о каждой конкретной операции базы данных в нашем модифицированном курсоре. Интерфейс для вызывающей стороны в методе get Jobs класса Mi croJobsDatabase впервые появляется в том коде, который мы приведем ниже. Задача метода заключается в том, чтобы возвратить JobsCursor, в котором перечислены вакансии из базы данных. Один параметр, передаваемый методу getJobs, позволяет пользователю выбрать, как отсортировать полученные вакансии – по столбцу title или по столбцу employerjiame:

Далее даются пояснения к коду.

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

Создание строки запроса. Большинство строк являются статическими (переменная QUERY), но эта строка зависит от выбора столбца, по которому происходит сортировка. Хотя QUERY и является закрытым полем, обрамляющий класс по-прежнему имеет доступ к ней. Это объясняется тем, что и метод get Jobs, и класс JobsCursor находятся внутри класса Mi croJobsDatabase, который и предоставляет доступ к закрытым элементам JobsCursor для метода getJobs. Чтобы получить текст для сортировочного столбца, мы просто применяем toString к перечислимому параметру, переданному вызывающей стороной. Мы могли бы определить ассоциативный массив, который позволил бы нам более свободно именовать переменные, но приведенное выше решение проще. Кроме того, названия столбцов достаточно красиво всплывают на экране – это делается благодаря автозавершению, предусмотренному в нашей интегрированной среде разработки.

Получает описатель базы данных.

Создает курсор JobsCursor при помощи метода rawQueryWithFactory класса SQLiteDatabase. Он принимает фабричный метод, которым Android воспользуется, чтобы создать курсор именно такого типа, какой нам нужен. Если бы мы воспользовались более простым методом rawQuery, то получили бы стандартный Cursor, у которого нет особых свойств JobsCursor.

Для удобства вызывающей стороны, переходом к первой строке в возвращенном результате. Таким образом, курсор возвращается уже готовым к использованию. Часто программист забывает вызвать moveToFirst, а потом рвет на себе волосы, пытаясь понять, почему объект Cursor выдает сплошные исключения.

Курсор – это возвращаемое значение. Q Класс, создающий курсор, возвращаемый методом getJobs.

Простой способ предоставить альтернативные критерии сортировки: имена столбцов сохраняются в enum. Этот тип используется в элементе 2.

Конструктор для модифицированного курсора. Последний аргумент – это запрос, передаваемый вызывающей стороной.

Класс фабрики для создания курсора, вложен в класс JobsCursor.

Создается курсор из запроса, переданного вызывающей стороной.

Возвращает курсор к внешнему классу JobsCursor.

Вспомогательные функции, извлекающие конкретные столбцы из строки курсора. Например, getColTitle возвращает значение столбца title в строке, на которую в данный момент ссылается курсор. Таким образом, реализация базы данных отделяется от вызывающего кода и код становится проще читать.

Далее приведен пример использования базы данных. Код получает курсор, информация в котором отсортирована по заголовку. Это делается путем вызова getJobs. Потом происходит итерация процесса для каждой вакансии:

Рассмотрим пояснения к коду.

Создание объекта Mi croJobsDatabase. Аргумент this представляет контекст, как это было описано выше.

Создание курсора JobsCursor, использующего перечисление SortBy, рассмотренное выше.

Использование стандартных методов Cursor для итерации через курсор.

Все еще в рамках цикла вызывается один из специальных методов, предоставляемый JobsCursor для того, чтобы «что-нибудь сделать» на выбор пользователя. Метод будет вызван для каждого значения столбца title.

Использование метода query

В то время как в приложениях, выполняющих нетривиальные операции с базами данных, полезно изолировать предложения SQL, как было показано выше, для   • приложений, которые рассчитаны на простые операции с базами данных (например, для нашего SimpleFinchVideoContentProvider), не менее полезно использовать метод SQLiteDatabase.query. Рассмотрим следующий пример, относящийся к video:

Как и в случае с SQLiteDatabase.rawQueryWithFactory, показанным выше, объект Cursor является возвращаемым значением метода query. Здесь мы присваиваем данный курсор переменной videoCursor, определенной выше.

Метод query применяет команду SELECT к таблице с заданным именем. В нашем случае имя таблицы хранится в константе VIDEOTABLENAME. Данный метод принимает два параметра. Во-первых, это проекция, где перечисляются столбцы, которые только и Должны отображаться в запросе, – значения других столбцов не появятся и в результатах курсора. Многие приложения отлично работают, просто передавая null вместо проекции, и в таком случае в результирующем курсоре отобразятся все столбцы. Далее, аргумент where содержит условие SQL where без ключевого слова WHERE. Кроме того, аргумент where может включать в себя ряд строк ‘ ? ‘, которые будут заменяться значениями whereArgs. При обсуждении метода execSQL мы более подробно поговорим о том, как связываются эти два значения.

Изменение базы данных

Курсоры Android отлично подходят для считывания информации из базы данных, но в классе android.database.Cursor нет методов для создания, обновления или удаления данных. В классе SQLiteDatabase предоставляется два базовых API, которые можно использовать как для считывания, так и для записи.

Набор из четырех методов, называемых іnsert, query, update и delete.

Более общий метод execSQL, принимающий каждое отдельное предложение SQL, которое не занимается возвратом данных, и применяющий это предложение к базе данных.

Рекомендуем пользоваться первыми четырьмя методами, когда требуется производить одноименные им операции (вставку, запрос, обновление и удаление). Мы покажем вам оба способа использования операций в MJAndroid.

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

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