Привет! Давайте разберёмся, что там накатили в новом мажоре Room. На момент последнего редактирования статьи актуальная версия — 3.0.0-alpha03, а стабильный релиз, вероятно, будет к лету.

Если вдруг выпали из контекста: Room — это повсеместно используемая ORM‑обёртка над SQLite. Раньше только для Android, с недавнего времени и для Kotlin Multiplatform.

Что изменилось?

  1. Новый пакет androidx.room → androidx.room3.

  2. Убрана зависимость от Android‑специфичного SQLite Driver API. Для публичного API появились задокументированные аналоги.

    // Было
    roomDatabase.query("select * from users").use { cursor -> ... }
    
    // Стало
    roomDatabase.useReaderConnection { connection ->
      connection.usePrepared("select * from users") { stmt -> ... }
    }
  3. Kotlin и Coroutines. Room2 генерировал Java‑код через KAPT. Теперь всё — только через KSP. Плюс, всё API работы с DAO и внутрянка по‑возможности переписаны на корутины.

  4. Поддержка Web. Раньше KMP‑версия Room не дружила с wasm. Комьюнити поныло — и вот, дожали. Так что mobile web разработчики могут порадоваться, а те, кто тащил wasm на всякий случай — тоже не зря ждали.

  5. Почистили старые депрекейты.

Миграция

Тут всё довольно спокойно, без сюрпризов.

Что нужно сделать:

  1. Обновить зависимости и плагин (добавить «3»)

    // root build.gradle.kts
    plugins {
        id("androidx.room3") version "3.0.0-alpha03" apply false
    }
    
    // lib build.gradle.kts
    plugins {
        id("androidx.room3")
    }
    
    android {}
    
    // iosX64()
    iosArm64()
    iosSimulatorArm64()
    
    wasmJs {}
    
    // Для наглядности. Используйте version catalog
    kotlin {
      sourceSets {
        val roomVersion = "3.0.0-alpha03"
        val sqliteVersion = "2.6.2"
        
        commonMain.dependencies {
          implementation("androidx.room3:room3-runtime:$roomVersion")
        }
    
        listOf(androidMain, iosMain).forEach { target ->
          target.dependencies {
            implementation("androidx.sqlite:sqlite-bundled:$sqliteVersion")
          }
        }
    
        wasmJsMain.dependencies {
           implementation("androidx.sqlite:sqlite-web:$sqliteVersion")
        }
      }
    }
    
    dependencies {
        add("kspAndroid", "androidx.room3:room3-compiler:$roomVersion")
        add("kspIosSimulatorArm64", "androidx.room3:room3-compiler:$roomVersion")
        add("kspIosArm64", "androidx.room3:room3-compiler:$roomVersion")
        add("kspWasmJs", "androidx.room3:room3-compiler:$roomVersion")
    }
    
    room3 {
        schemaDirectory("$projectDir/schemas")
    }
  2. Поменять пакеты (RoomDatabase, @Entity и прочее на room3).

  3. Дальше по классике — собрать → получить ошибки → исправить. Кое‑где добавили suspend, поменяли нейминг. Должно быть просто.

Насколько это необходимо?

Поддержка web — давно пора. Котлин и корутины — бесценно для KMP разработки в 2026. Остальное приятно.

Так что — затаскиваем как будет стабильная версия.

А если появилось желание апгрейднуться сейчас — подсвечу, что это лишь альфа версия, и могут быть внезапные гугл мувы и изменения без обратной совместимости.

Проблемы при интеграции

На текущий момент есть ряд неочевидных проблем с подключением этого дела.

  1. Ошибка при использовании под iosX64 (эмуляторы на Intel Mac): Doesn't say anything about org.jetbrains.kotlin.native.target (required 'ios_x64')

    Я просто убрал поддержку iosX64 в своём проекте, так как у меня Mac на Apple чипе. Другое решение, надеюсь, появится в следующих версиях.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Делаем?
12.5%Сейчас апну2
31.25%В пятницу вечером5
0%Без тикета не буду0
56.25%Только stable после остальных9
Проголосовали 16 пользователей. Воздержался 1 пользователь.