Выпущена первая альфа-версия 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 полностью поддерживается 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 Plugin и KSP, не затрагивая остальную часть базы кода.
Room 3.0 также требует сопрограмм, и, в частности, функции 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 можно найти в документации по SQLiteDriver API.
Подробную информацию о том, как перевести Room на использование API SQLiteDriver, можно найти в официальной документации по переходу с 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. Следите за новостями!
-
Новости о продуктахВ эпоху искусственного интеллекта пользователи больше не просто нажимают на кнопки в приложениях. Они ставят перед собой глобальные цели и ожидают, что ИИ-агенты, такие как Gemini, будут выполнять многоэтапные рабочие процессы, иногда в нескольких приложениях на их устройствах.
Jingyu Shi • Время на чтение: 4 минуты -
Новости о продуктахСегодня на Саммите для разработчиков Android мы объявляем о широкой доступности многих инструментов и API, которые помогут вам преодолевать повседневные трудности и дадут больше гибкости при создании отличных приложений для Android.
Matthew McCullough • Время на чтение: 4 минуты -
Новости о продуктахAndroid Studio Rabbit 2 теперь стабильна и готова к использованию в рабочей среде. В этом выпуске представлены ключевые функции, которые помогут вам в разработке, например Bring Your Own Agent, новые функции XR Emulator, обновление LeakCanary, новый инструмент управления навыками агента, код-ревью с помощью ИИ и многое другое.
Matthew Warner • Время на чтение: 3 минуты
Получайте еженедельную рассылку с последними новостями о разработке для Android.