Annotated SQL Геннадий Дубина Android-разработчик, DataArt, Украина Чего хочется • • • • • Описываем схему один раз Описываем схему в одном месте Мало кода Легкость Читаемость Создание схемы БД • • • • Написание скриптов руками Срипты/база в ресурсах Runtime framework для создания схемы Annotation processor Inline SQL External SQL RF Annotations + - + + +/- - - + Мало кода - - - + Легкость - +/- + + Читаемость - + + + Один раз В одном месте Принцип описания схемы • Таблица – интерфейс. – имя таблицы – имена колонок – path для провайдера • Схема – класс/интерфейс со всеми таблицами Annotation SQL • • • • • • • Это не ORM Никакой магии Это утилита/плагин для сокращения количества кода Все можно посмотреть и потрогать Плагин для Eclipse Работает с ant Работает c Idea #1 SQL Schema • • • • • • @Schema – структура, которая описывает схему @Table – таблица в базе @Index – индекс на таблице @PrimaryKey - ключ @SimpleView – вьюшка в базе @RawQuery – запрос в контент провайдере @Schema Класс содержащий описание всех таблиц, вьюшек, запрос Атрибуты • className • dbName • dbVersion @Table Определяем таблицу •@Column – type [INTEGER, REAL, TEXT, BLOB] – defVal •@Autoincrement •@NotNull •@PrimaryKey •@Unique[ROLLBACK, ABORT, FAIL, IGNORE, REPLACE] @Index Создаем индекс для таблички. Будет создан индекс с именем idx_<name> Атрибуты •name •columns @PrimaryKey Создаем составной Primary Key для таблицы Атрибуты •columns @SimpleView Создаем view для выборки данных из нескольких таблиц/view Столбцы создаются с именем <alias>_<column> Атрибуты •value – имя view Определяем вьюшку • @From • @ Join – joinTable – таблица которую присоединяем – joinColumn – onTableAlias – алиас таблицы к которой присоединяем – onColumn – type [INNER, LEFT, RIGHT, CROSS] • @RawJoin – joinTable – таблица переменной – onCondition – raw sql вашего условия – type [INNER, LEFT, RIGHT, CROSS] • @Columns - что выбираем • @IgnoreColumns – ничего не выбираем @RawQuery Создаем sql запрос который будет выполняться в Content Provider. Как и view только с параметрами Атрибуты •value – имя запроса Плюшки •@SqlQuery Валидация схемы • • • • • • • • • Таблица без столбцов Более одного PrimaryKey для таблицы Индекс не содержит полей Дублирующиеся названия таблиц/вьюшек Существование @From во вьюшке Существование колонок в таблицах/view @From/@Join Дублирующиеся alias во view Пустое название таблицы/столбца/индекса/вьюшки Индекс можно определить только для таблицы #2 Content Provider Создаем полноценный провайдер с помощью нескольких строк при этом сохраняем human style Поддерживает: •no-notify •limit •alternative notify uri •bulkInsert •triggers Аннотации • • • • @Provider – помечаем схему @URI – таблица/вью доступно через контент провайдер @Trigger – обработчик на действие с таблицей @Triggers @Provider Атрибуты: •name •schemaClass •authority •openHelperClass @URI • • • • type [DIR, ITEM, DIR_AND_ITEM] сolumn – по умолчанию _id altNotify onlyQuery – по умолчанию false все опционально Пример @Trigger Атрибуты: •name •type [INSERT, DELETE, UPDATE, ALL] •when [BEFORE, AFTER] Методы: •on<Name><When>Inserted(ContentValues values) •on<Name><When>Deleted(Uri uri, String selection, String[] selectionArgs) •on<Name><When>Updated(Uri uri, ContentValues values, String selection, String[] selectionArg) Human Style Вопросы?