Novità sul prodotto

Room 3.0: modernizzazione della libreria

Lettura di 4 minuti
Daniel Santiago Rivera
Ingegnere del software

È stata rilasciata la prima versione alpha di Room 3.0. Room 3.0 è una versione principale della libreria che provoca un errore, incentrata su Kotlin Multiplatform (KMP) e che aggiunge il supporto per JavaScript e WebAssembly (WASM) oltre al supporto esistente per Android, iOS e JVM desktop. 

In questo post del blog descriviamo le modifiche che provocano un errore, 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 che provocano un errore all'API: 

  • 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 backend possibili.
  • Nessuna generazione di codice Java: Room 3.0 genera esclusivamente codice Kotlin. Ciò è in linea con il paradigma in evoluzione di Kotlin-first, ma semplifica anche la codebase e il processo di sviluppo, consentendo iterazioni più rapide.
  • Focus su KSP: stiamo anche abbandonando 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.
  • Coroutines first: Room 3.0 adotta le coroutine Kotlin, rendendo le sue API coroutine-first. Coroutines è 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 ID artefatto. Ad esempio, androidx.room:room-runtime è diventato androidx.room3:room3-runtime e le classi come androidx.room.RoomDatabase si troveranno ora in androidx.room3.RoomDatabase.

Kotlin e Coroutines 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 multi-modulo in cui l'utilizzo di Room è concentrato e il plug-in Kotlin Gradle e KSP possono essere applicati senza influire sul resto della codebase.

Room 3.0 richiede anche Coroutines e, più in particolare, 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 sulle coroutine su Android per iniziare a integrare le coroutine 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 tutti i vantaggi di Room 3.0, incluso l'utilizzo della libreria SQLite in bundle tramite BundledSQLiteDriver. Puoi iniziare la migrazione alle API del driver oggi stesso con Room 2.7.0+. 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

Ci rendiamo conto che la rimozione completa di SupportSQLite potrebbe non essere immediatamente fattibile per tutti i progetti. Per semplificare questa transizione, Room 2.8.0, l'ultima versione della serie Room 2.0, ha introdotto un nuovo artefatto denominato androidx.room:room-sqlite-wrapper. Questo artefatto offre un'API di compatibilità che 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. Questo fornisce un ponte temporaneo per gli sviluppatori che hanno bisogno di più tempo per eseguire la migrazione completa della codebase. 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 invocazioni di roomDatabase.openHelper.writableDatabase possono essere sostituite da roomDatabase.getSupportWrapper() e verrà fornito un wrapper anche se viene chiamato setDriver() sul builder di Room.

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

Supporto web di Room e SQLite

Il supporto per le destinazioni Kotlin Multiplatform JS e WasmJS comporta alcune delle modifiche più significative alle API. In particolare, molte API in Room 3.0 sono funzioni di sospensione, poiché il supporto corretto 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 di origine (OPFS).

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

Tipi di restituzione 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 denominata @DaoReturnTypeConverter, puoi creare la tua integrazione in modo che il codice generato di Room diventi accessibile in fase di runtime. In questo modo, le funzioni @Dao possono avere i propri tipi di restituzione personalizzati senza dover attendere che il team di Room aggiunga il supporto. Le integrazioni esistenti vengono migrate per utilizzare questa funzionalità e, pertanto, ora sarà necessario che gli utenti che si affidano a questa funzionalità aggiungano i convertitori alle definizioni @Database o @Dao.

Ad esempio, il convertitore di paginazione si troverà 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 di restituzione DAO nelle note di rilascio di Room 3.0.

Modalità di manutenzione di Room 2.x

Poiché lo sviluppo di Room sarà incentrato 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 portare avanti questo lavoro fino a quando Room 3 non diventerà stabile.

Considerazioni finali

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

Continua a leggere