В этом уроке рассмотрим подробнее аннотации Insert, Update и Delete. А также узнаем, как использовать транзакции в Room.
Полный список уроков курса:
- Урок 1. Lifecycle
- Урок 2. LiveData
- Урок 3. LiveData. Дополнительные возможности
- Урок 4. ViewModel
- Урок 5. Room. Основы
- Урок 6. Room. Entity
- Урок 7. Room. Insert, Update, Delete, Transaction
- Урок 8. Room. Query
- Урок 9. Room. RxJava
- Урок 10. Room. Запрос из нескольких таблиц. Relation
- Урок 11. Room. Type converter
- Урок 12. Room. Миграция версий базы данных
- Урок 13. Room. Тестирование
- Урок 14. Paging Library. Основы
- Урок 15. Paging Library. PagedList и DataSource. Placeholders.
- Урок 16. Paging Library. LivePagedListBuilder. BoundaryCallback.
- Урок 17. Paging Library. Виды DataSource
- Урок 18. Android Data Binding. Основы
- Урок 19. Android Data Binding. Код в layout. Доступ к View
- Урок 20. Android Data Binding. Обработка событий
- Урок 21. Android Data Binding. Observable поля. Двусторонний биндинг.
- Урок 22. Android Data Binding. Adapter. Conversion.
- Урок 23. Android Data Binding. Использование с include, ViewStub и RecyclerView.
- Урок 24. Navigation Architecture Component. Введение
- Урок 25. Navigation. Передача данных. Type-safe аргументы.
- Урок 26. Navigation. Параметры навигации
- Урок 27. Navigation. NavigationUI.
- Урок 28. Navigation. Вложенный граф. Global Action. Deep Link.
- Урок 29. WorkManager. Введение
- Урок 30. WorkManager. Критерии запуска задачи.
- Урок 31. WorkManager. Последовательность выполнения задач.
- Урок 32. WorkManager. Передача и получение данных
- Урок 33. Практика. О чем это будет.
- Урок 34. Практика. TodoApp. Список задач.
- Урок 35. Практика. TodoApp. Просмотр задачи
Insert
Аннотация Insert - это простой способ вставить объект в базу данных. Мы уже использовали ее в примерах прошлых уроков.
Использование этой аннотации выглядит так:
@Dao public interface EmployeeDao { @Insert void insert(Employee employee); // ... }
В Dao интерфейсе описываем метод, который на вход принимает Entity объект. К методу добавляем аннотацию Insert и Room сгенерирует необходимый код в реализации этого интерфейса.
Давайте посмотрим, какие еще возможности у нас есть.
Вставка нескольких объектов
Мы можем передавать в метод не один, а несколько объектов, используя varargs
@Insert void insertMany(Employee... employees);
Также, это может быть список:
@Insert void insert(List<Employee> employees);
Или это вообще может быть любой Iterable:
@Insert void insert(Iterable<Employee> employees);
При вызове этого метода вы можете использовать массив или коллекцию.
Получение id
При вставке метод Insert может возвращать id только что добавленной записи. Для этого надо описать метод так, чтобы он возвращал long.
@Insert long insert(Employee employee);
Если в Employee есть числовой первичный ключ, то именно его значение вы и получите.
В случае добавления нескольких записей, необходимо использовать long[]
@Insert long[] insert(List<Employee> employees);
или List<Long>
@Insert List<Long> insert(List<Employee> employees);
Режимы вставки
Рассмотрим ситуацию, когда мы вставляем в таблицу запись, но обнаруживается, что запись с таким ключом там уже есть. По умолчанию мы получим ошибку: SQLiteConstraintException: UNIQUE constraint failed. И ничего в базу не запишется.
Но это можно поменять с помощью параметра onConflict.
@Insert(onConflict = OnConflictStrategy.REPLACE) void insert(Employee employee);
В режиме REPLACE старая запись будет заменена новой. Этот режим хорошо подходит, если вам надо вставить запись, если ее еще нет в таблице или обновить запись, если она уже есть.
Также есть режим IGNORE. В этом режиме будет оставлена старая запись и операция вставки не будет выполнена.
Более подробно об этих режимах можно прочесть здесь.
Update
Эта аннотация аналогична Insert, но она не вставляет, а обновляет объекты в бд.
@Update void update(Employee employee);
Так же, как и с Insert мы можем использовать коллекции и varargs, чтобы обновлять несколько объектов сразу.
Update ищет в бд запись по ключу. Если не найдет, то ничего не произойдет. Если найдет, то обновит все поля, а не только те, которые мы заполнили в Entity объекте.
Мы можем получить количество обновленных записей. Для этого опишите метод так, чтобы он возвращал int.
@Update int update(List<Employee> employee);
Как и Insert, Update поддерживает параметр onConflict.
Delete
Методы с аннотацией Delete будут удалять объекты.
@Delete void delete(Employee employee);
В Delete методах мы также можем использовать коллекции и varargs, чтобы удалять несколько объектов сразу.
Delete ищет в бд запись по ключу.
Мы можем получить количество удаленных записей. Для этого необходимо описать метод так, чтобы он возвращал int.
@Delete int delete(List<Employee> employee);
Аннотации Insert, Update и Delete позволяют выполнить простые операции. Для более сложных действий необходимо использовать SQL запросы: INSERT, UPDATE и DELETE. Это можно сделать с помощью аннотации Query. В следующем уроке мы рассмотрим эту возможность.
Транзакции
Аннотация @Transaction позволяет выполнять несколько методов в рамках одной транзакции.
Рассмотрим пример, когда нам нужно добавить объекты Car и Employee:
@Dao public abstract class EmployeeCarDao { @Insert public abstract void insertEmployee(Employee employee); @Insert public abstract void insertCar(Car car); @Transaction public void insertCarAndEmployee(Car car, Employee employee) { insertCar(car); insertEmployee(employee); } }
EmployeeCarDao - отдельный Dao объект для работы с комбинацией Car и Employee. В нем описываем методы для вставки объектов по отдельности, а затем оба этих метода вызываем в одном методе с аннотацией Transaction. В итоге вставятся либо оба объекта, либо, в случае возникновения ошибки, ни один из них.
Обратите внимание, что в этом случае Dao - не интерфейс, а абстрактный класс.
Присоединяйтесь к нам в Telegram:
- в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня