Novità sul prodotto

Room 3.0 - Modernizzazione di Room

Lettura di 4 minuti
Daniel Santiago Rivera
Ingegnere del software

È stata rilasciata la prima alpha di Room 3.0. Room 3.0 è una versione principale della libreria che introduce modifiche sostanziali e si concentra su Kotlin Multiplatform (KMP), aggiungendo il supporto per JavaScript e WebAssembly (WASM) oltre a quello esistente per Android, iOS e JVM desktop. 

In questo blog descriviamo le modifiche sostanziali, il ragionamento alla base di Room 3.0 e le varie operazioni che puoi eseguire per eseguire la migrazione da Room 2.0.

Modifiche che provocano un errore

Room 3.0 include le seguenti modifiche all'API che provocano errori: 

  • Rimozione delle API SupportSQLite:Room 3.0 è completamente supportato dalle API del driver androidx.sqlite. Le API SQLiteDriver sono compatibili con KMP e la rimozione della dipendenza di Room dall'API di Android semplifica la superficie dell'API per Android, in quanto evita di avere due possibili backend.
  • Nessuna generazione di codice Java: Room 3.0 genera esclusivamente codice Kotlin. Ciò è in linea con il paradigma Kotlin-first in evoluzione, ma semplifica anche la base di codice e il processo di sviluppo, consentendo iterazioni più rapide.
  • Focus su KSP:stiamo anche ritirando il supporto per l'elaborazione delle annotazioni Java (AP) e KAPT. Room 3.0 è esclusivamente un processore KSP (Kotlin Symbol Processing), che consente una migliore elaborazione delle codebase Kotlin senza essere limitato dal linguaggio Java.
  • Coroutine per prime: Room 3.0 adotta le coroutine Kotlin, rendendo le sue API coroutine-first. Le coroutine sono il framework asincrono compatibile con KMP e rendere Room asincrono per natura è un requisito fondamentale per supportare le piattaforme web.

Un nuovo pacchetto

Per evitare problemi di compatibilità con le implementazioni Room 2.x esistenti e per le librerie con dipendenze transitive da Room (ad esempio WorkManager), Room 3.0 si trova in un nuovo pacchetto, il che significa che ha anche un nuovo gruppo Maven e nuovi ID artefatto. Ad esempio, androidx.room:room-runtime è diventato androidx.room3:room3-runtime e le classi come androidx.room.RoomDatabase ora si trovano all'indirizzo androidx.room3.RoomDatabase.

Kotlin e coroutine first

Senza la generazione di codice Java, Room 3.0 richiede anche KSP e il compilatore Kotlin anche se la codebase che interagisce con Room è in Java. È consigliabile avere un progetto multimodulo in cui l'utilizzo di Room è concentrato e il plug-in Kotlin Gradle e KSP possono essere applicati senza influire sul resto del codebase.

Room 3.0 richiede anche le coroutine e, più nello specifico, le funzioni DAO devono essere sospese, a meno che non restituiscano un tipo reattivo, ad esempio un flusso. Room 3.0 non consente di bloccare le funzioni DAO. Consulta la documentazione relativa alle coroutine su Android per iniziare a integrarle nella tua applicazione.

Migrazione alle API SQLiteDriver

Con l'abbandono di SupportSQLite, le app dovranno eseguire la migrazione alle API SQLiteDriver. Questa migrazione è essenziale per sfruttare appieno i vantaggi di Room 3.0, tra cui l'utilizzo della libreria SQLite in bundle tramite BundledSQLiteDriver. Puoi iniziare la migrazione alle API del driver oggi stesso con Room 2.7.0 o versioni successive. Ti consigliamo vivamente di evitare qualsiasi ulteriore utilizzo di SupportSQLite. Se esegui la migrazione delle integrazioni di Room alle API SQLiteDriver, la transizione a Room 3.0 è più semplice, poiché la modifica del pacchetto comporta principalmente l'aggiornamento dei riferimenti ai simboli (importazioni) e potrebbe richiedere modifiche minime ai siti di chiamata.

Per una breve panoramica delle API SQLiteDriver, consulta la documentazione delle API SQLiteDriver.

Per ulteriori dettagli su come eseguire la migrazione di Room per utilizzare le API SQLiteDriver, consulta la documentazione ufficiale per la migrazione da SupportSQLite.

Wrapper SupportSQLite di Room

Siamo consapevoli che la rimozione completa di SupportSQLite potrebbe non essere immediatamente fattibile per tutti i progetti. Per facilitare questa transizione, Room 2.8.0, l'ultima versione della serie Room 2.0, ha introdotto un nuovo artefatto chiamato androidx.room:room-sqlite-wrapper. Questo artefatto offre un'API di compatibilità che ti consente di convertire un RoomDatabase in un SupportSQLiteDatabase, anche se le API SupportSQLite nel database sono state disattivate a causa dell'installazione di un SQLiteDriver. In questo modo, gli sviluppatori che hanno bisogno di più tempo per eseguire la migrazione completa del codebase possono usufruire di un ponte temporaneo. Questo artefatto continua a esistere in Room 3.0 come androidx.room3:room3-sqlite-wrapper per consentire la migrazione a Room 3.0 supportando al contempo l'utilizzo critico di SupportSQLite.

Ad esempio, le chiamate di roomDatabase.openHelper.writableDatabase possono essere sostituite da roomDatabase.getSupportWrapper() e verrà fornito un wrapper anche se setDriver() viene chiamato nel builder di Room.

Per ulteriori dettagli, consulta la documentazione di room-sqlite-wrapper.

Supporto di Room e SQLite Web

Il supporto per le piattaforme multiple Kotlin ha come target JS e WasmJS e introduce alcune delle modifiche più significative alle API. Nello specifico, molte API in Room 3.0 sono funzioni di sospensione, poiché il supporto adeguato per l'archiviazione web è asincrono. Anche le API SQLiteDriver sono state aggiornate per supportare il web ed è disponibile un nuovo driver asincrono web in androidx.sqlite:sqlite-web. Si tratta di un driver basato su Web Worker che consente di rendere persistente il database nel file system privato dell'origine (OPFS).

Per maggiori dettagli su come configurare Room per il web, consulta le note di rilascio di Room 3.0.

Tipi di ritorno DAO personalizzati

Room 3.0 introduce la possibilità di aggiungere integrazioni personalizzate a Room simili a RxJava e Paging. Tramite una nuova API di annotazione chiamata @DaoReturnTypeConverter, puoi creare la tua integrazione in modo che il codice generato da Room diventi accessibile in fase di runtime. In questo modo, le funzioni @Dao possono avere i propri tipi restituiti personalizzati senza dover attendere che il team di Room aggiunga il supporto. Le integrazioni esistenti vengono migrate per utilizzare questa funzionalità e pertanto ora richiedono che chi si affida a questa funzionalità aggiunga i convertitori alle definizioni di @Database o @Dao.

Ad esempio, il convertitore di paginazione si trova nell'artefatto androidx.room3:room3-paging e si chiama PagingSourceDaoReturnTypeConverter. Nel frattempo, per LiveData il convertitore si trova in androidx.room3:room3-livedata e si chiama LiveDataDaoReturnTypeConverter.

Per ulteriori dettagli, consulta la sezione Convertitori di tipi restituiti DAO nelle note di rilascio di Room 3.0.

Modalità di manutenzione di Room 2.x

Poiché lo sviluppo di Room si concentrerà su Room 3, la versione attuale di Room 2.x entra in modalità di manutenzione. Ciò significa che non verranno sviluppate funzionalità principali, ma verranno comunque rilasciate patch (2.8.1, 2.8.2 e così via) con correzioni di bug e aggiornamenti delle dipendenze. Il team si impegna a continuare a lavorare finché Room 3 non diventerà stabile.

Considerazioni finali

Siamo entusiasti del potenziale di Room 3.0 e delle opportunità che offre all'ecosistema Kotlin. Continua a seguirci per altri aggiornamenti.

Continua a leggere