
В начале было слово
Я уже говорил в недавнем времени о выборе платформы Android в качестве хобби-изучения на ближайшее время. И так, чтобы провести учиться с пользой буду рассказывать о том, как проходит этот самый процесс.
У меня нет никакой четкой и выверенной программы обучения. Не никакого плана: сначала это, потом это, потом то. Единственный мой план — это собственная интуиция. В общем-то, как бог на душу положит одним словом.
По-этому не удивляйтесь, что на роль первого погружения в Андроид я выбрал трепанацию SQLite, как базы данных для хранения данных андроид-приложении.
Цели
- Понять, как устроена работа с базой данных в самом широком смысле
- Какие эффективные практики следует применять при работе?
- Какие классы и объекты чаще всего используются? Какие методы следует знать, как свои пять пальцев?
- Как база данных связана со остальными частями приложения? Где создается, где вызывается?
Начало
Базы данных имеют больше значение в программировании хотя бы по тому, что каждый из нас с ними сталкивался (или столкнется). В Андроиде реализована поддержка баз данных на уровне каждого приложения. Т.е. создать и работать с базой данных внутри приложения настолько естественно в Андроиде, как дышать воздухом. По умолчанию доступен интерфейс для работы с базами данных SQLite. Поддержки никаких других СУБД мною замечено не было, значит за основу берем единственно доступный SQLite.
Ради справедливости стоит отметить, что сторонние разработчики предлагают свои продукты, как альтернативу SQLite. Это db4object и mcobject.
Но о них мы поговорим, как-нибудь потом. Сейчас для этого не время.
Небольшое введение (SQLite)
SQLite — библиотека, которая позволяет создавать база данных, который обладают рядом приятных и уникальных особенностей. Во-первых – это независимость. Под независимостью я понимаю минимальный объем сторонних библиотек и функций, которые ей нужны. Создатели говорят, что SQLite можно скомпилировать любым С компилятором и с использованием только таких библиотечных функций, как:
- memset()
- memcpy()
- memcmp()
- strcmp()
- malloc()
- free()
- realloc()
Это позволяет использовать эту библиотеку в разнообразных мобильных устройствах, mp3-плеерах, да и просто в любом месте, где требуется компактная база данных.
Во-вторых, в SQLite нет никакого серверного процесса. База данных хранится в файле. И весь доступ к ней осуществляется, как к файлу. Следовательно ничего не надо устанавливать. Нет никакого процесса установки. Ты просто подключил и используешь.
В-третьих, все запросы являются транзакциями, что обеспечивает такие свойства, как Атомарность, Непротиворечивость, Изоляцию и Долговечность (ACID)
Вывод из этой все прелести очень простой. В Андроиде можно работать с базой данных, как с настоящей базой данных со всеми запросами, insert’ами и update’ами не задумываясь о том, как все это храниться в чистоте и порядке.
Конечно, свойства SQLite откладывают свой отпечаток на работу с ней. Так, например, открытие доступа к базе может потребовать создание нового файла и так далее. Но API Андроида делает большинство работы за нас. И многом мы можем и не заботиться, как убедимся позже.
Продолжение введения (паттерн Адаптер и Шаблон )
Одно из любимых слов в Android API — это Адаптер. Встречаются они повсюду, и по-этому следует уяснить, что же это такое. Хорошо, что это совсем не трудно.
Выжимка из книги Design Patterns:
Паттерн Адаптер (известен также как Wrapper, «Обертка»)
Назначение: Преобразует интерфейс одного класса к интерфейсу другого.
Мотивация: Иногда класс из инструментальной библиотеки, спроектированный для повторного использования, не удается использовать только потому, что его интерфейс не соответствует тому, который нужен конкретному приложению.
Если быть понятнее, то Адаптер используют для предоставления доступа к объекту через специальный интерфейс. Одной из причин этому может быть несоответствие исходного интерфейса. Другая причина — просто создание более удобного интерфейса, который скрывает ненужные подробности работы с исходным объектом, и предоставляет удобную альтернативу.
С последней причиной очень тесно паттерн Шаблон. Цель этого паттерна — создание класса, который модифицирует логику своего подкласса таким образом, чтобы сделать его завершенным — например, скрыть конфигурационные параметры, методы для проверки прав, да и вообще все , что угодно.
Для удобства приведу пример некоторого псевдо-класса для работы с базой данных. Пусть у нас есть класс для доступа к базе. Назовем его Database. Для создания соединения мы передаем в конструкторе необходимые реквизиты: имя базы данных, пользователя, пароль:
class Database {
private Connection mConnection;
Database(String database_name, String username, String password) {
connection = getDbConnection( database_name, username, password);
}
....
}
Это утомительно — каждый раз помнить и передавать параметры к базе, когда нам понадобится к ней доступ. Как выход, можно создать класс MyDatabase, который дополнял бы класс Database нужным нам образом. Выглядеть это будет примерно так:
class MyDatabase extends Database {
private static final String DATABASE_NAME = "sample_database";
private static final String USERNAME = "user";
private static final String PASSWORD = "password";
MyDatabase() {
super(DATABASE_NAME, USERNAME, PASSWORD);
}
...
}
Все. Теперь достаточно вызвать new MyDatabase() и все будет сделано за нас.
Для чего я все это рассказываю? Для того, что приведенный выше прием станет одним из наших любимых при написании классов для работы с базой данных, да и вообще в большинстве аспектов работы над приложениями в Андроиде.
Работа с базой данных (общая картина)
Начнем с простого. Любой процесс работы с базой данных включает в себе четко определенный набор методов.
- Создание базы данных. Или ее открытие базы.
- Работа с базой данных:
- Заполнение базы данными (вставка)
- Изменение существующих данных (обновление)
- Выбор данных по различным критерия (выборка)
- Удаление данных
Конец первой части
На сегодня все. Завтра будем самое основное – увидим Андроид в действии, разберем классы и там уже пойдем дальше.