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

Комната 3.0 - Модернизация комнаты

4 минуты чтения
Daniel Santiago Rivera
Программист

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

В этом блоге мы расскажем о существенных изменениях, обосновываем необходимость Room 3.0 и описываем различные способы миграции с Room 2.0.

Изменения, нарушающие покой

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

  • Отказ от поддержки API SQLite: Room 3.0 полностью использует API драйвера androidx.sqlite . API SQLiteDriver совместимы с KMP, и отказ от зависимости Room от API Android упрощает интерфейс 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 также требует наличия корутин, и, в частности, функции DAO должны быть приостановлены, если они не возвращают реактивный тип, например, Flow. Room 3.0 запрещает блокирующие функции DAO. См. документацию по корутинам в Android , чтобы узнать, как начать интегрировать корутины в ваше приложение.

Переход на API SQLiteDriver

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

Для краткого обзора API SQLiteDriver ознакомьтесь с документацией по API SQLiteDriver .

Для получения более подробной информации о том, как перевести Room на использование API SQLiteDriver, ознакомьтесь с официальной документацией по миграции с SupportSQLite .

Room SupportSQLite wrapper

Мы понимаем, что полное удаление 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

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

Более подробную информацию о настройке Room for the Web можно найти в примечаниях к выпуску Room 3.0 .

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

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

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

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

Режим технического обслуживания комнаты 2.x

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

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

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

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