Выпущена первая альфа-версия 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. Следите за новостями!
-
Новости о продуктахПриложения, предназначенные для предстоящего выпуска Android, больше не смогут напрямую записывать данные в контакты с помощью разрешения WRITE_CONTACTS.
Roxanna Aliabadi Walker • Время на чтение: 6 минут -
Новости о продуктахПо мере развития агентных технологий разработка для Android выходит на новый уровень: от вспомогательного автозаполнения кода до агентов, выполняющих сквозные задачи под вашим руководством. Вы можете выбирать любые модели и агентов.
Jason Buchel • Время на чтение: 3 минуты -
Новости о продуктахСегодня мы рассказали, как планируем развивать концепцию "больше, чем магазин". Google Play доступен пользователям на разных платформах. Например, вкладка "Вы" – это персональный центр управления, которым ежемесячно пользуются более 250 миллионов активных пользователей за месяц. А наша единая игровая платформа объединяет более 700 миллионов игровых профилей.
Paul Feng • Время на чтение: 3 минуты
Получайте еженедельную рассылку с последними новостями о разработке для Android.