Room vs SQLDelight em 2026: qual biblioteca de persistencia escolher?
A persistencia de dados e um componente essencial em aplicacoes mobile e multiplataforma. Room e SQLDelight sao as duas bibliotecas mais populares para trabalhar com SQLite em projetos Kotlin. Este artigo compara ambas em detalhes para ajudar voce a escolher a mais adequada para seu projeto.
Visao geral
| Caracteristica | Room | SQLDelight |
|---|---|---|
| Criador | Google (Jetpack) | Square / CashApp |
| Abordagem | ORM com anotacoes | SQL-first com geracao de codigo |
| Multiplataforma | Somente Android | Kotlin Multiplatform |
| Coroutines | Suporte nativo | Suporte nativo |
| Migracao | Automatica e manual | Manual com SQL |
| IDE | Android Studio | IntelliJ / Android Studio |
Abordagem fundamental
Room utiliza uma abordagem ORM onde voce define entidades como classes Kotlin e queries como metodos com anotacoes:
@Entity(tableName = "usuarios")
data class UsuarioEntity(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
val nome: String,
val email: String,
val dataCriacao: Long = System.currentTimeMillis()
)
@Dao
interface UsuarioDao {
@Query("SELECT * FROM usuarios ORDER BY nome ASC")
fun listarTodos(): Flow<List<UsuarioEntity>>
@Query("SELECT * FROM usuarios WHERE id = :id")
suspend fun buscarPorId(id: Int): UsuarioEntity?
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun inserir(usuario: UsuarioEntity)
@Delete
suspend fun deletar(usuario: UsuarioEntity)
@Query("SELECT * FROM usuarios WHERE nome LIKE '%' || :termo || '%'")
fun buscarPorNome(termo: String): Flow<List<UsuarioEntity>>
}
@Database(entities = [UsuarioEntity::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun usuarioDao(): UsuarioDao
}
SQLDelight utiliza uma abordagem SQL-first onde voce escreve SQL puro em arquivos .sq e a biblioteca gera codigo Kotlin type-safe:
-- Usuario.sq
CREATE TABLE usuario (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
email TEXT NOT NULL,
data_criacao INTEGER NOT NULL DEFAULT 0
);
listarTodos:
SELECT * FROM usuario ORDER BY nome ASC;
buscarPorId:
SELECT * FROM usuario WHERE id = ?;
inserir:
INSERT OR REPLACE INTO usuario (nome, email, data_criacao)
VALUES (?, ?, ?);
deletar:
DELETE FROM usuario WHERE id = ?;
buscarPorNome:
SELECT * FROM usuario WHERE nome LIKE '%' || ? || '%';
O codigo gerado pelo SQLDelight oferece funcoes type-safe para cada query definida:
// Uso do codigo gerado
val database = Database(driver)
val queries = database.usuarioQueries
// Listar com Flow
val usuarios: Flow<List<Usuario>> = queries.listarTodos()
.asFlow()
.mapToList(Dispatchers.IO)
// Inserir
queries.inserir(
nome = "Maria",
email = "maria@email.com",
data_criacao = Clock.System.now().toEpochMilliseconds()
)
Seguranca de tipos
Room valida queries SQL em tempo de compilacao usando annotation processing. Erros em queries sao detectados durante a compilacao, o que e uma grande vantagem sobre acesso SQL manual. Porem, a validacao depende do schema definido pelas entidades anotadas.
SQLDelight tambem valida SQL em tempo de compilacao, mas vai alem ao gerar modelos de dados diretamente a partir do schema SQL. Isso garante que o codigo Kotlin esta sempre sincronizado com o schema do banco de dados.
Performance
| Aspecto | Room | SQLDelight |
|---|---|---|
| Overhead de abstracoes | Baixo | Minimo |
| Geracao de codigo | Annotation processing | Gradle plugin |
| Tempo de compilacao | Moderado | Rapido |
| Runtime overhead | Pequeno (reflexao minima) | Minimo |
| Cache de queries | Sim | Sim |
Ambas as bibliotecas oferecem performance excelente. SQLDelight tende a ter um overhead ligeiramente menor por nao utilizar reflexao e gerar codigo mais direto. Na pratica, a diferenca e negligivel para a maioria das aplicacoes.
Kotlin Multiplatform
Esta e a maior diferenca estrategica entre as duas bibliotecas. SQLDelight suporta Kotlin Multiplatform nativamente, permitindo compartilhar a camada de persistencia entre Android, iOS, desktop e backend com o mesmo codigo SQL.
Room e especifico para Android e nao oferece suporte a outras plataformas. Se voce planeja compartilhar codigo entre plataformas, SQLDelight e a unica opcao entre as duas.
Migracoes de schema
Room oferece migracoes automaticas para mudancas simples e migracoes manuais para cenarios complexos:
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE usuarios ADD COLUMN telefone TEXT")
}
}
SQLDelight utiliza migracoes SQL puras em arquivos numerados:
-- 1.sqm
ALTER TABLE usuario ADD COLUMN telefone TEXT;
Ambas as abordagens funcionam bem. Room oferece mais automacao para migracoes simples, enquanto SQLDelight da controle total com SQL puro.
Integracao com Jetpack Compose
Ambas as bibliotecas se integram bem com Jetpack Compose atraves de Flow e collectAsState. A experiencia e similar em ambos os casos, com dados reativos fluindo do banco para a UI de forma transparente.
Ecossistema e comunidade
Room faz parte do Jetpack e possui documentacao extensa, exemplos oficiais do Google e uma comunidade enorme. E a escolha padrao para a maioria dos projetos Android.
SQLDelight possui documentacao boa e uma comunidade ativa, embora menor. Sendo desenvolvido pela Square/CashApp, possui manutencao profissional e releases regulares.
Casos de uso recomendados
Quando usar Room
Room e ideal para projetos exclusivamente Android, equipes familiarizadas com o ecossistema Jetpack, projetos que se beneficiam de migracoes automaticas e aplicacoes que precisam do suporte e documentacao extensos do Google.
Quando usar SQLDelight
SQLDelight e ideal para projetos Kotlin Multiplatform que compartilham persistencia, equipes que preferem SQL puro a abstraccoes ORM, projetos que priorizam performance maxima e aplicacoes onde o controle total sobre queries e prioritario.
Veredicto
Em 2026, a escolha entre Room e SQLDelight depende principalmente de uma pergunta: seu projeto precisa de suporte multiplataforma? Se sim, SQLDelight e a escolha clara. Se nao, ambas sao excelentes, com Room oferecendo mais conveniencia e integracao com o Jetpack, e SQLDelight oferecendo mais controle e performance marginal superior. Para novos projetos que podem eventualmente precisar de multiplataforma, SQLDelight e a escolha mais estrategica a longo prazo.