Новости о продуктах

Room 3.0 – модернизация Room

Время на чтение: 4 минуты
Посмотреть профиль пользователя Daniel Santiago Rivera
Daniel Santiago Rivera Разработчик программного обеспечения

Выпущена первая альфа-версия Room 3.0. Room 3.0 – это крупное обновление библиотеки, которое ориентировано на Kotlin Multiplatform (KMP) и добавляет поддержку JavaScript и WebAssembly (WASM) в дополнение к существующей поддержке Android, iOS и JVM. 

В этой статье мы расскажем о критических изменениях, причинах создания Room 3.0 и о том, как перейти с Room 2.0.

Критические изменения

В Room 3.0 внесены следующие критические изменения API: 

  • Прекращение поддержки SupportSQLite API. Room 3.0 полностью поддерживается androidx.sqlite driver API. SQLiteDriver API совместимы с KMP, а удаление зависимости Room от Android API упрощает API для Android, поскольку позволяет избежать двух возможных бэкендов.
  • Прекращение генерации кода Java. Room 3.0 генерирует только код Kotlin. Это соответствует развивающейся парадигме Kotlin-first, а также упрощает базу кода и процесс разработки, позволяя быстрее выполнять итерации.
  • Переход на KSP. Мы также прекращаем поддержку Java Annotation Processing (AP) и KAPT. Room 3.0 – это исключительно процессор KSP (Kotlin Symbol Processing), который позволяет лучше обрабатывать базы кода Kotlin, не ограничиваясь языком Java.
  • Приоритет сопрограмм.  Room 3.0 поддерживает сопрограммы Kotlin, поэтому его API ориентированы на них. Сопрограммы – это асинхронный фреймворк, совместимый с KMP. Асинхронность Room – критически важное требование для поддержки веб-платформ.

Новый пакет

Чтобы избежать проблем совместимости с существующими реализациями Room 2.x и библиотеками с транзитивными зависимостями от Room (например, WorkManager), Room 3.0 находится в новом пакете, а значит у него также есть новые идентификаторы группы и артефакта Maven. Например, androidx.room:room-runtime заменено на androidx.room3:room3-runtime, а классы, такие как androidx.room.RoomDatabase, теперь будут находиться в androidx.room3.RoomDatabase.

Kotlin и сопрограммы

Поскольку генерация кода Java больше не поддерживается, для Room 3.0 также требуется KSP и компилятор Kotlin, даже если база кода, взаимодействующая с Room, написана на Java. Рекомендуется использовать многомодульный проект, в котором сосредоточено использование Room и можно применять плагин Kotlin Gradle и KSP, не затрагивая остальную часть базы кода.

Room 3.0 также требует Coroutines, и, в частности, функции DAO должны быть приостановлены, если они не возвращают реактивный тип, например Flow. Room 3.0 запрещает блокировать функции DAO. Ознакомьтесь с документацией по сопрограммам в Android, чтобы узнать, как интегрировать их в приложение.

Переход на SQLiteDriver API

В связи с отказом от SupportSQLite приложениям потребуется перейти на SQLiteDriver API. Это необходимо, чтобы использовать все преимущества Room 3.0, в том числе встроенную библиотеку SQLite через BundledSQLiteDriver. Вы можете начать переход на API драйверов уже сегодня, используя Room 2.7.0+. Мы настоятельно рекомендуем избегать дальнейшего использования SupportSQLite. Если вы перенесете интеграции Room в API SQLiteDriver, переход на Room 3.0 будет проще, поскольку изменение пакета в основном включает обновление ссылок на символы (импорт) и может потребовать минимальных изменений в сайтах вызовов.

Краткий обзор SQLiteDriver API можно найти в документации.

Подробную информацию о том, как перевести Room на использование SQLiteDriver API, можно найти в официальной документации по переходу с SupportSQLite.

Оболочка Room SupportSQLite

Мы понимаем, что полностью удалить SupportSQLite может быть невозможно сразу для всех проектов. Чтобы упростить этот переход, в Room 2.8.0, последней версии серии Room 2.0, был представлен новый артефакт под названием androidx.room:room-sqlite-wrapper. Этот артефакт предлагает API совместимости, который позволяет преобразовать RoomDatabase в SupportSQLiteDatabase, даже если API SupportSQLite в базе данных были отключены из-за установки SQLiteDriver. Это временное решение для разработчиков, которым нужно больше времени, чтобы полностью перенести базу кода. Этот артефакт по-прежнему существует в Room 3.0 как androidx.room3:room3-sqlite-wrapper, чтобы обеспечить переход на Room 3.0 и при этом поддерживать критически важное использование SupportSQLite.

Например, вызовы roomDatabase.openHelper.writableDatabase можно заменить на roomDatabase.getSupportWrapper(), а оболочка будет предоставлена, даже если setDriver() вызывается в конструкторе Room.

Подробную информацию можно найти в документации по room-sqlite-wrapper.

Поддержка Room и SQLite Web

Поддержка Kotlin Multiplatform для JS и WasmJS, а также некоторые из наиболее значительных изменений API. В частности, многие API в Room 3.0 являются функциями приостановки, поскольку надлежащая поддержка веб-хранилища является асинхронной. API SQLiteDriver также были обновлены для поддержки Интернета, а в androidx.sqlite:sqlite-web доступен новый веб-асинхронный драйвер. Это драйвер на основе Web Worker, который позволяет сохранять базу данных в частной файловой системе источника (OPFS).

Подробную информацию о том, как настроить Room для веб-версии, можно найти в примечаниях к выпуску Room 3.0.

Пользовательские типы возвращаемых значений DAO

В Room 3.0 появилась возможность добавлять в Room собственные интеграции, аналогичные RxJava и Paging. Новый API аннотаций @DaoReturnTypeConverter позволяет создавать собственные интеграции, чтобы сгенерированный Room код был доступен во время выполнения. Это позволяет функциям @Dao иметь собственные типы возвращаемых значений, не дожидаясь, пока команда Room добавит поддержку. Существующие интеграции переносятся для использования этой функции, поэтому тем, кто на нее полагается, потребуется добавить конвертеры в определения @Database или @Dao.

Например, конвертер Paging будет находиться в артефакте androidx.room3:room3-paging и называться PagingSourceDaoReturnTypeConverter. Для LiveData конвертер находится в androidx.room3:room3-livedata и называется LiveDataDaoReturnTypeConverter.

Подробную информацию можно найти в разделе "Преобразователи типов возвращаемых значений DAO" в примечаниях к выпуску Room 3.0.

Режим обслуживания Room 2.x

Поскольку разработка Room будет сосредоточена на Room 3, текущая версия Room 2.x переходит в режим обслуживания. Это означает, что новые функции разрабатываться не будут, но исправления ошибок и обновления зависимостей будут по-прежнему выпускаться в виде патчей (2.8.1, 2.8.2 и т. д.). Команда будет работать над этим, пока Room 3 не станет стабильной.

Заключительное мнение

Мы очень рады потенциалу Room 3.0 и возможностям, которые он открывает для экосистемы Kotlin. Следите за новостями!

Продолжить чтение