Notícias sobre produtos

Room 3.0: modernização do Room

Leitura de 4 min
Ver o perfil de Daniel Santiago Rivera
Daniel Santiago Rivera Engenheiro de software

A primeira versão Alfa do Room 3.0 foi lançada. O Room 3.0 é uma versão principal da biblioteca que se concentra no Kotlin Multiplatform (KMP) e adiciona suporte para JavaScript e WebAssembly (WASM) além do suporte atual para Android, iOS e JVM para computador. 

Neste blog, descrevemos as alterações interruptivas, o raciocínio por trás do Room 3.0 e as várias coisas que você pode fazer para migrar do Room 2.0.

Alterações interruptivas

O Room 3.0 inclui as seguintes mudanças interruptivas na API: 

  • Remoção das APIs SupportSQLite:o Room 3.0 é totalmente compatível com as APIs de driver androidx.sqlite. As APIs SQLiteDriver são compatíveis com KMP, e a remoção da dependência do Room na API do Android simplifica a plataforma da API para o Android, já que evita ter dois back-ends possíveis.
  • Não há mais geração de código Java:o Room 3.0 gera exclusivamente código Kotlin. Isso se alinha ao paradigma em evolução que prioriza o Kotlin, mas também simplifica a base de código e o processo de desenvolvimento, permitindo iterações mais rápidas.
  • Foco no KSP:também estamos encerrando o suporte ao processamento de anotações (AP) do Java e ao KAPT. O Room 3.0 é exclusivamente um processador KSP (Kotlin Symbol Processing), o que permite um melhor processamento de bases de código Kotlin sem as limitações da linguagem Java.
  • Foco em corrotinas : o Room 3.0 adota as corrotinas do Kotlin, tornando as APIs focadas nelas. As corrotinas são o framework assíncrono compatível com o KMP, e tornar o Room assíncrono por natureza é um requisito essencial para oferecer suporte a plataformas da Web.

Um novo pacote

Para evitar problemas de compatibilidade com as implementações atuais do Room 2.x e com bibliotecas com dependências transitivas para o Room (por exemplo, WorkManager), o Room 3.0 reside em um novo pacote, o que significa que ele também tem um novo grupo do Maven e IDs de artefato. Por exemplo, androidx.room:room-runtime se tornou androidx.room3:room3-runtime, e classes como androidx.room.RoomDatabase agora estão localizadas em androidx.room3.RoomDatabase.

Kotlin e corrotinas em primeiro lugar

Sem a geração de código Java, o Room 3.0 também exige o KSP e o compilador Kotlin, mesmo que a base de código que interage com o Room esteja em Java. É recomendável ter um projeto de vários módulos em que o uso do Room esteja concentrado e o plug-in do Kotlin para Gradle e o KSP possam ser aplicados sem afetar o restante da base de código.

O Room 3.0 também exige corrotinas e, mais especificamente, as funções DAO precisam ser de suspensão, a menos que retornem um tipo reativo, como um Flow. O Room 3.0 não permite o bloqueio de funções DAO. Consulte a documentação sobre corrotinas no Android para saber como começar a integrar corrotinas ao seu aplicativo.

Migração para as APIs SQLiteDriver

Com a mudança do SupportSQLite, os apps precisarão migrar para as APIs SQLiteDriver. Essa migração é essencial para aproveitar todos os benefícios do Room 3.0, incluindo o uso da biblioteca SQLite integrada pelo BundledSQLiteDriver. Você já pode começar a migrar para as APIs de driver com o Room 2.7.0+. Recomendamos que você evite usar o SupportSQLite. Se você migrar suas integrações do Room para as APIs SQLiteDriver, a transição para o Room 3.0 será mais fácil, já que a mudança de pacote envolve principalmente a atualização de referências de símbolos (importações) e pode exigir mudanças mínimas nos sites de chamada.

Para uma breve visão geral das APIs SQLiteDriver, consulte a documentação das APIs SQLiteDriver.

Para mais detalhes sobre como migrar o Room para usar as APIs SQLiteDriver, confira a documentação oficial para migrar do SupportSQLite.

Wrapper SupportSQLite do Room

Sabemos que remover completamente o SupportSQLite pode não ser viável imediatamente para todos os projetos. Para facilitar essa transição, o Room 2.8.0, a versão mais recente da série Room 2.0, introduziu um novo artefato chamado androidx.room:room-sqlite-wrapper. Esse artefato oferece uma API de compatibilidade que permite converter um RoomDatabase em um SupportSQLiteDatabase, mesmo que as APIs SupportSQLite no banco de dados tenham sido desativadas devido à instalação de um SQLiteDriver. Isso oferece uma ponte temporária para desenvolvedores que precisam de mais tempo para migrar totalmente a base de código. Esse artefato continua existindo no Room 3.0 como androidx.room3:room3-sqlite-wrapper para permitir a migração para o Room 3.0, mas ainda oferece suporte ao uso crítico do SupportSQLite.

Por exemplo, as invocações de roomDatabase.openHelper.writableDatabase podem ser substituídas por roomDatabase.getSupportWrapper(), e um wrapper será fornecido mesmo se setDriver() for chamado no builder do Room.

Para mais detalhes, confira a documentação do room-sqlite-wrapper.

Suporte do Room e do SQLite para Web

Suporte para os destinos JS e WasmJS do Kotlin Multiplatform, além de algumas das mudanças mais significativas na API. Especificamente, muitas APIs no Room 3.0 são funções de suspensão, já que o suporte adequado para armazenamento na Web é assíncrono. As APIs SQLiteDriver também foram atualizadas para oferecer suporte à Web, e um novo driver assíncrono da Web está disponível em androidx.sqlite:sqlite-web. É um driver baseado em Web Worker que permite manter o banco de dados no sistema de arquivos particular de origem (OPFS, na sigla em inglês).

Para mais detalhes sobre como configurar o Room para Web, confira as notas da versão do Room 3.0.

Tipos de retorno personalizados de DAO

O Room 3.0 introduz a capacidade de adicionar integrações personalizadas ao Room, semelhantes ao RxJava e à Paging. Com uma nova API de anotação chamada @DaoReturnTypeConverter, é possível criar sua própria integração para que o código gerado pelo Room fique acessível no momento da execução. Isso permite que as funções @Dao tenham tipos de retorno personalizados sem precisar esperar que a equipe do Room adicione o suporte. As integrações atuais foram migradas para usar essa funcionalidade e, portanto, agora exigem que os usuários adicionem os conversores às definições de @Database ou @Dao.

Por exemplo, o conversor de paginação vai estar localizado no artefato androidx.room3:room3-paging e é chamado de PagingSourceDaoReturnTypeConverter. Enquanto isso, para LiveData, o conversor está em androidx.room3:room3-livedata e é chamado de LiveDataDaoReturnTypeConverter.

Para mais detalhes, confira a seção "Conversores de tipo de retorno do DAO" nas notas da versão do Room 3.0.

Modo de manutenção do Room 2.x

Como o desenvolvimento do Room vai se concentrar na versão 3, a versão atual 2.x entra em modo de manutenção. Isso significa que nenhum recurso importante será desenvolvido, mas as versões de patch (2.8.1, 2.8.2 etc.) ainda vão ocorrer com correções de bugs e atualizações de dependência. A equipe está comprometida com esse trabalho até que o Room 3 se torne estável.

Considerações finais

Estamos muito animados com o potencial do Room 3.0 e as oportunidades que ele oferece para o ecossistema do Kotlin. Fique de olho nas próximas atualizações enquanto continuamos essa jornada.

Escrito por:
Continue lendo