Більше року тому я написав статтю «Огляд кращої AndroidORM - ActiveAndroid«. Я б так і продовжив використовувати цю чудову ORM, якби кілька АЛЕ:
2) Неможливість unit-тестування (викидає виключення) і неможливість це виправити (див. Пункт 1)
3) Проблеми з новими версіями Android
4) Баги, які я не помітив і які можуть вилізти пізніше, коли буде вже пізно
У зв'язку з цим я вирішив змінити ORM на що-небудь свіжіше і трохи краще. Мені радили багато різних бібліотек, але я все ніяк не міг визначитися з «найкращою». Спочатку мій вибір припав на squidb. але від неї теж довелося відмовитися через складність її використання. Та й кодогенерацію я не дуже люблю. Зрештою я знайшов ту саму бібліотеку, яка мені була потрібна - DBFlow.
невеликий огляд
Однією з проблем, з існуючих ORM-бібліотек є те, що вони використовують Java-рефлексію для визначення моделей баз даних, схем таблиць і відносин стовпців. DBFlow є однією з небагатьох бібліотек, яка спирається виключно на обробку анотацій для створення Java-коду, заснованого на базі SQLiteOpenHelper. Такий підхід призводить до збільшення продуктивності під час виконання, і в той же час позбавляє вас від необхідності писати багато шаблонного коду, як правило, необхідного для опису таблиць, виконання запити і т. Д.
підключення бібліотеки
Насамперед потрібно підключити плагін apt. прописавши наступні рядки в кореневому build.gradle файлі вашого проекту:
Також нам потрібно прописати репозиторій jitpack.io в блоці з allprojects -> repositories:
Далі в файлі app / build.gradle активуйте плагін android-apt і додайте DBFlow в список залежностей. Ми створимо окрему змінну для зберігання номера версії, щоб її було простіше змінювати в майбутньому:
Створення бази даних
визначення таблиць
Java-класи, які виступають в якості моделей повинні успадковуватися від BaseModel. Крім того в анотації ми повинні вказати базу даних, до якої відноситься таблиця. Тут ми покажемо, як створити таблиці для організацій і користувачів:
Ми дуже легко можемо пов'язати моделі за допомогою анотації ForeignKey. Значення saveForeignKeyModel означає оновлення зовнішнього ключа, при оновленні запису. В цьому випадку ми відключаємо цю функцію:
Використання бібліотеки Parceler
Якщо разом з DBFlow ви використовуєте бібліотеку Parceler. додайте до Вакша класу анотацію @Parcel (analyze =). В іншому випадку бібліотека Parceler спробує серіалізовать поля, пов'язані з класом BaseModel і викличе помилку Error: Parceler: Unable to find read / write generator for type. Щоб уникнути цієї проблеми, потрібно вказати, який саме клас в ланцюжку спадкування повинні бути досліджений:
ініціалізація DBFlow
Далі ми повинні ініціалізувати DBFlow в класі Application:
Змініть клас додатки в файлі AndroidManifest.xml:
створення записів
Для збереження запису в таблицю ми просто повинні викликати метод .save ():
читання записів
Читання записів також проводиться дуже легко:
оновлення записів
Повторний виклик методу save () у об'єкта оновить запис по первинному ключу.
видалення записів
Для видалення запису ми повинні викликати метод delete ():
виконання транзакцій
Також ви можете вставити в таблицю групу елементів, використовуючи клас ProcessModelTransaction:
міграції БД
Міграції визначаються шляхом створення класу міграції або шляхом розміщення валидного SQL-файлу в папку assets / migrations // вашого проекту. Нижче наведено приклад класу міграції:
Виправлення помилок
Клас моделі не знайдено
Так як DBFlow потрібно від обробки анотацій, іноді вам може знадобитися натиснути Build -> New Project для генерації вихідного коду.
Використання з GSON
Якщо ви збираєтеся використовувати DBFlow з бібліотекою Gson. ви можете отримати виняток StackOverflowError при спробі використовувати об'єкти Java. які успадковуються від BaseModel. Для того щоб уникнути цих проблем. необхідно виключити клас ModelAdapter. який представляє собою поле в класі BaseModel:
Потім потрібно створити користувальницький Gson Builder, щоб виключити цей клас:
Перейдіть сюди для отримання додаткової інформації.
Бібліотека на GitHub: DBFlow