Скачиваний:
17
Добавлен:
17.06.2023
Размер:
707.58 Кб
Скачать

Базы данных. Введение в базы данных sqLite

Android использует для работы с базами данных известную библиотеку SQLite. SQLite зарекомендовала себя в качестве чрезвычайно надёжной системы баз данных, которая используется во многих бытовых электронных устройствах и программах, включая некоторые MP3-проигрыватели, iPhone, iPod Touch, Mozilla Firefox и др.

С помощью SQLite вы можете создавать для своего приложения независимые реляционные базы данных для хранения и управления сложными данными приложения. Android хранит базы данных в каталоге /data/data/<имявашегопакета>/databases на вашем устройстве (или эмуляторе). По умолчанию все базы данных приватные, доступ к ним могут получить только те приложения, которые их создали.

Те, кто имеет опыт работы со связкой PHP+MySQL, найдут много знакомых вещей и быстро разберутся с принципом работы. Для остальных постараюсь объяснить максимально доступно.

Прежде всего нужно запомнить, что в Android уже есть готовый класс SQLiteOpenHelper, от которого нужно наследоваться. Помните, мы в своих проектах всегда наследовались от Activity (extends Activity). Точно так же надо поступить и при работе с базой данных.

Создаём базу данных

Создадим новый проект как обычно. Теперь нужно создать новый класс, который будет работать с базой данных - добавлять, выбирать, удалять и прочие операции. Создаеём новый класс и в диалоговом окне напротив текстового поля Superclass: нажимаем кнопку Browse.... Далее начинаем вводить первые символы класса, чтобы выбрать из списка нужный класс. Восьми символов оказалось вполне достаточно, чтобы в списке остался только один вариант. Нажимаем на кнопку OK для добавления класса в диалоговое окно и нажимаем на кнопку Finish, чтобы закончить с созданием класса.

Появится следующая заготовка:

Как видите, у класса есть два обязательных метода onCreate() и onUpgrade(), о которых поговорим позже.

Название класса будет подчёркнуто красной волнистой чертой, требуя создать конструктор. Вручную напишем конструктор перед методами, а также добавим пару констант:

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

Вторая константа DATABASE_VERSION требует дополнительных объяснений. Она отвечает за номер версии базы. Принцип её работы схож с номером версий самого приложения. Когда мы видим, что вышла новая версия Chrome 23, то понимаем, что пора обновляться. Аналогично поступает и само приложение, когда замечает, что номер версии базы стал другим. Как только программа заметила обновление номера базы, она запускает метод onUpgrade(), который у нас сформировался автоматически. В этом методе необходимо разместить код, который должен сработать при обновлении базы.

Теперь нужно объяснить, зачем нужен этот метод onUpgrade(). Представьте ситуацию, что вы первоначально создали в базе таблицу, в которую заносятся имена котов и их электронные адреса и телефоны (о_О). Вроде всё замечательно. Если нужно поздравить усатых-полосатых с Международным днём кошек, который отмечается 1 марта, то проблем нет никаких. У вас есть список имён, по которому вы можете пройтись и лично написать каждому письмо. Пользователи, скачавшие ваше приложение, с удовольствием заполняют базу данных и дружно пишут письма мелким почерком. И вдруг до вас дошло, что совершили непростительную ошибку. Вы забыли добавить в базу данных даты рождения котов. А значит их никто не поздравит и не погладит.

Вы исправляете досадное упущение и выкладываете новую версию программы в открытый доступ. Новые пользователи, которые скачают программу первый раз, радуются жизни - у них есть все необходимые данные для работы. Но что делать тем, кто уже работает со старой программой? Обновившись, они увидят дополнительное текстовое поля для ввода даты рождения, но в старой базе нет колонки для приёма новых данных. И ваша программа завершится с ошибкой. Полностью удалять и устанавливать новую версию программы тоже не выход - тогда пропадут старые данные, что тоже не желательно. Для таких случаев вы пишете код в методе onUpgrade(), чтобы при обновлении поменялась структура базы данных у старых пользователей.

Метод onCreate() вопросов не вызывает - здесь создаётся сама база данных с необходимыми данными для работы.

Однако продолжим. Мы указали имя файла для базы данных и её номер. Также нужно указать имя таблицы и имена колонок для таблицы. Давайте для начала создадим совсем простую таблицу, которая будет содержать только имена котов.

Я сказал только про имена котов, а в коде создал две константы (подлый обманщик). Первая константа - это просто идентификатор. Он будет настроен таким образом, что будет автоматически увеличиваться на единицу при каждом добавлении нового имени. Очень удобная штука, между прочим. Кстати, обратите внимание, что в имени идентификатора используется символ подчёркивания. Это не случайно. На самом деле, можно было и не использовать символ подчёркивания, так как сама база SQLite не накладывет никаких ограничений. Но разработчики Google решили немного повыпендриваться и рекомендовали использовать именно такой синтаксис, в противном случае у вас не будут работать запросы к базе данных, основанные на курсорах.

Практически всё готово. Так как описание команд SQL выходит за рамки статьи, то дальше галопом по европам. Для создания таблицы в SQL используется команда CREATE TABLE .... Для удобства вынесем команду в отдельную строку. Аналогично поступим с командой DROP TABLE. Сами команды помещаются в метод execSQL(). Полный листинг сейчас будет выглядеть следующим образом:

На всякий случай расскажу ещё об одной хитрости. Вам понравится. Помните, я вам рассказывал про идентификатор _id? Разработчики в Google (те самые, которые выпендривались) решили, что данный идентификатор используется всегда, поэтому не нужно заставлять программиста вручную создавать данный идентификатор. Нужно сделать небольшое изменение в коде. После слов extends SQLiteOpenHelper добавьте ещё implements BaseColumns. Теперь у вашего класса есть встроенный идентификатор. Переменную UID можете спокойно удалять (я же говорил, что вам понадобится одна константа, а вы не верили), и заменить её присутствие в коде на ИмяКласса._ID, в нашем случае CatsDataBase._ID. Во многих примерах почему-то избегают данного подхода, но вдруг на собеседовании вас спросят. Правильный ответ гарантирует вам приём на работу (10% от первой зарплаты не забудьте мне перечислить).