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

Комната 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 по своей природе является критически важным требованием для поддержки веб-платформ.

Новая упаковка

To prevent compatibility issues with existing Room 2.x implementations and for libraries with transitive dependencies to Room (for example, WorkManager), Room 3.0 resides in a new package which means it also has a new maven group and artifact ids. For example, androidx.room:room-runtime has become androidx.room3:room3-runtime and classes such as androidx.room.RoomDatabase will now be located at 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

With the shift away from SupportSQLite, apps will need to migrate to the SQLiteDriver APIs. This migration is essential to leveraging the full benefits of Room 3.0, including allowing the use of the bundled SQLite library via the BundledSQLiteDriver . You can start migrating to the driver APIs today with Room 2.7.0+. We strongly encourage you to avoid any further usage of SupportSQLite. If you migrate your Room integrations to SQLiteDriver APIs, then the transition to Room 3.0 is easier since the package change mostly involves updating symbol references (imports) and might require minimal changes to call-sites.

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

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

Room SupportSQLite wrapper

We understand completely removing SupportSQLite might not be immediately feasible for all projects. To ease this transition, Room 2.8.0, the latest version of the Room 2.0 series, introduced a new artifact called androidx.room:room-sqlite-wrapper . This artifact offers a compatibility API that allows you to convert a RoomDatabase into a SupportSQLiteDatabase , even if the SupportSQLite APIs in the database have been disabled due to a SQLiteDriver being installed. This provides a temporary bridge for developers who need more time to fully migrate their codebase. This artifact continues to exist in Room 3.0 as androidx.room3:room3-sqlite-wrapper to enable the migration to Room 3.0 while still supporting critical SupportSQLite usage.

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

Для получения более подробной информации ознакомьтесь с документацией room-sqlite-wrapper .

Поддержка веб-интерфейсов Room и SQLite

Support for the Kotlin Multiplatform targets JS and WasmJS and brings some of the most significant API changes. Specifically, many APIs in Room 3.0 are suspend functions since proper support for web storage is asynchronous. The SQLiteDriver APIs have also been updated to support the Web and a new web asynchronous driver is available in androidx.sqlite:sqlite-web . It is a Web Worker based driver that enables persisting the database in the Origin private file system (OPFS).

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

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

Room 3.0 introduces the ability to add custom integrations to Room similar to RxJava and Paging. Through a new annotation API called @DaoReturnTypeConverter you can create your own integration such that Room's generated code becomes accessible at runtime, this enables @Dao functions having their custom return types without having to wait for the Room team to add the support. Existing integrations are migrated to use this functionality and thus will now require for those who rely on it to add the converters to the @Database or @Dao definitions.

Например, конвертер для пейджинга будет находиться в артефакте 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. Следите за обновлениями, чтобы не пропустить этот этап!

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