Пример приложения с GreenDAO. Зеленый помощник в работе с БД.

Если вы читаете эти строки, то, скорее всего, вам захотелось чего-то нового в отношениях с вашей базой данных. Вам надоел курсор, SQL запросы вы пишете каждый день и ощущение обыденности остудило те чувства, с которыми вы впервые сохраняли данные в БД.  Что же, GreenDAO внесёт свежий поток в процесс разработки!

Библиотека от немецкой компании Greenrobot позиционируется как инструмент для объектно-реляционного отображения  (ORM) данных в приложениях на Android, являясь прослойкой, реализующей шаблон проектирования DAO(Data Access Object). Если вы не знаете что это за шаблон, то многое в статье будет не понятно и лучше для начала прочитать эту статью.  На момент написания статьи ребята выпустили уже версию 3.2.0, в которой побороли многие детские болячки и прихлопнули горсть багов.  С помощью аннотаций происходит разметка сущности, требующей сохранения, создание DAO классов, таблиц и всю рутинную работу с ними библиотека взваливает на себя.

1.С чего начать?

Дружба начинается с улыбки, а использование библиотеки с её подключения в проект. В нашем случае одной строчкой в Gradle отделаться не получиться, всё чуть-чуть сложнее.  Для начала идём в Gradle проекта и подключаем пути, добавляя строчку classpath ‘org.greenrobot:greendao-gradle-plugin:3.2.1’

как на скриншоте:

 

Далее уже в Gradle файле модуля добавляем зависимости и подключаем плагин:

apply plugin: ‘org.greenrobot.greendao’

compile ‘org.greenrobot:greendao:3.2.0’

Плагин подключаем обязательно выше всех, в первой строчке. Баг это или фича – не нам судить. Ещё необходимо выполнить начальную конфигурацию GreenDAO, для чего добавляем блок

greendao{
    schemaVersion 1
    targetGenDir ‘src/main/java’
}

как указано на скриншоте:

Этот блок выполнит настройку GreenDAO. При тривиальных задачах можно не вникать в тюнинг библиотеки, но schemaVersion вы в любом случае должны будете указать и в случае её изменения инкрементировать это значение. Но если вам интересно, есть такие опции как:

schemaVersion – текущая версия схемы базы данных. Настройка используется OpenHelper’s классами для миграции между версиями схем. Как я и говорил, при изменении схемы делаете инкремент. По умолчанию значение 1.

daoPackage – Имя пакета для генерации DAOs, DaoMaster и DaoSession. По умолчанию – имя пакета, в котором будет находиться исходная сущность.

targetGenDir – место, где будут сгенерированы исходники. По умолчанию – директория проекта.

GenerateTests – можно задать true для автоматической генерации юнит-тестов.

targetGenDirTests – директория с тестами.

Всё, подключение выполнено.


2. Создание бизнес-модели.

Давайте теперь немного отвлечемся и посмотрим на то, что будем сохранять. У нас будет приложение – питомник котиков. Можно будет добавлять новых и отдавать в добрые руки старых котов. У котиков будут свойства — имя и порода. Давайте же опишем класс, не забыв добавить в него геттеры и сеттеры.

 

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

В разметке всего 2 файла, для отображения элемента списка и главной активити:

activity_main.xml

cat_item.xml

Код активити:

 

Добавляем необходимые библиотеки в Gradle

compile ‘com.android.support:recyclerview-v7:25.3.0’
compile ‘com.android.support:design:25.3.0’

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


 

3.Подготовка к отображению в БД.

Библиотека использует аннотации, с помощью которых мы подготовим наших котиков к их отображению в базе данных. Добавим к классу нашего котика немного аннотаций, подготовим его к упаковке.

 

Что изменилось? Начнем сверху. Перед описанием класса находиться анноттация @Entity. Она сообщает GreenDAO что необходимо создать в базе данных таблицу с отображением помеченной сущности. Для этой аннотации можно задать дополнительные параметры:

 

 

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

Спускаемся ниже, где встречаем новое поле класса – id с аннотацией #Id. Так называемый суррогатный ключ. В бизнес модели он то нам не нужен, его судьба – быть первичным ключом в таблице, во что его и превращает аннотация @Id.

Поля breed и name помечены аннотациями @NotNull, что сообщает GreenDAO что в соответствующих столбцах не смогут храниться null значения. Данной аннотацией нельзя помечать примитивные поля, если такая необходимость возникла, то используйте классы-обёртки.

Есть ещё несколько аннотаций, одна из которых @Transient – исключает поле из процесса сохранения.

Переходим к самому интересному Хотите немного айтишной магии? Выполним сборку проекта(Build -> Make Project или Ctrl+F9). Проект собирается, но вы можете заметить, что мы теперь не одни, рядом с классом Cat теперь появились дополнительные классы, которые реализуют шаблон DAO. Но это ещё не всё, код нашего класса Cat также подвергся изменениям, а точнее дополнениям! Всё что сгенерировано дополнительно, помечается аннотацией @Generated. Разработчики настоятельно не рекомендуют править сгенерированный код, но если уж такая необходимость появляется, то замените после правки аннотацию @Generated на @Keep.

После первого сбора проекта мы можем пользоваться классами greenDAO.

DaoMaster – это точка входа для использования DreenDAO. DaoMaster содержит объект базы данных(SQLiteDatabase) и менеджеры DAO —  классы, описывающие схемы.  Также в нём есть статичные методы для создания и удаления таблиц. Его внутренние классы OpenHendler и DevOpenHendler являющиеся реализациями SQLiteOpenHendler, которые создают схему в базе данных SQLite.

DaoSession – управляет всеми доступными DAO объектами для описанной схемы, которые можно получить с помощью геттеров. DaoSession также предоставляет некоторые обобщенные методы, такие как insert, load, update, refresh и delete для сущностей.

CatDao – объект доступа к данным, сохраняющий и загружающий сущности. Для каждой сущности greenDao создает объект сущностьDao(Cat – CatDao, Man – ManDao, Client – ClientDao и т.п.).  CatDao содержит уже расширенный список методов для работы с базой данных, например – count, loadAll и insertLnTx.

В контексте нашего примера мы можем создавать экземпляры DAO классов непосредственно перед использованием, на нашу архитектуру это никак не повлияет(так как её практически нет >_<). Но давайте всё же сделаем правильно и вынесем в отдельное место инициализацию. Для этого создадим класс App и унаследуемся от Application(не забудьте указать его файлом приложения в манифесте).

манифест

Всё готово, теперь мы можем использовать классы DAO для сохранения и загрузки наших котиков. Финальная версия класса MainActivity:

 

 

И адаптера:

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

По-моему библиотека заслуживает внимания, она мало весит и показывает хорошие результаты в скорости.  Если нужно, могу дополнить пример ещё несколькими таблицами с разными связями, код из примера можете взять на Гитхабе. Всем добра!

P.s. Если есть неудержимое желание поддержать Javaway и котиков, можете сделать это тут =)


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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *