Sobes.tech
Junior

Qual é a diferença entre Room e SQLite?

sobes.tech IA

Resposta da IA

O SQLite é uma base de dados relacional leve integrada no Android. O Room é uma biblioteca de abstração sobre o SQLite que fornece uma API de nível superior para trabalhar com a base de dados, simplificando a interação e reduzindo a probabilidade de erros.

Principais diferenças:

  • ORM: O Room é um ORM (Object-Relational Mapper), permitindo trabalhar com dados na forma de classes POJO, em vez de diretamente com tabelas e colunas.
  • Verificações em tempo de compilação: O Room realiza verificações de consultas à base de dados durante a compilação, detectando erros de sintaxe e discrepâncias nos tipos de dados antes de executar a aplicação.
  • Simplificação do código: O Room gera código boilerplate para trabalhar com a base de dados (por exemplo, para converter POJO em linhas da tabela e vice-versa), o que reduz significativamente a quantidade de código manual.
  • Suporte para LiveData e Flow: O Room integra-se com componentes do Android Architecture Components, como LiveData e Flow, facilitando o trabalho com operações assíncronas e a observação de alterações nos dados.
  • Migrações: O Room fornece um mecanismo conveniente para realizar migrações da base de dados ao alterar o esquema.

Exemplo de uso do Room:

// Entidade
@Entity
data class User(
    @PrimaryKey val userId: Int,
    val name: String,
    val age: Int
)

// DAO (Data Access Object)
@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAllUsers(): List<User>

    @Insert
    fun insertUser(user: User)
}

// Base de dados
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Exemplo de uso direto do SQLite com SQLiteOpenHelper:

// Helper para a base de dados
class DbHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {

    override fun onCreate(db: SQLiteDatabase) {
        val createTableQuery = """
            CREATE TABLE users (
                _id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT,
                age INTEGER
            )
        """.trimIndent()
        db.execSQL(createTableQuery)
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        db.execSQL("DROP TABLE IF EXISTS users")
        onCreate(db)
    }

    companion object {
        private const val DATABASE_NAME = "mydatabase.db"
        private const val DATABASE_VERSION = 1
    }
}

// Exemplo de inserção de dados
val dbHelper = DbHelper(context)
val db = dbHelper.writableDatabase
val values = ContentValues().apply {
    put("name", "Alice")
    put("age", 30)
}
db.insert("users", null, values)
db.close()
Característica Room SQLite (direto)
Tipo ORM (biblioteca de abstração) Base de dados relacional
Trabalho com dados Objetos (POJO) Linhas e colunas
Verificações Em tempo de compilação Principalmente em tempo de execução
Código boilerplate Gerado automaticamente Requer escrita manual
Integração com AAC Sim (LiveData, Flow) Não
Migrações API conveniente Requer implementação manual
Facilidade de uso Alta Menor, mais propenso a erros

O uso do Room é preferido na maioria dos casos para desenvolvimento novo, pois simplifica significativamente o trabalho com a base de dados, aumenta a confiabilidade do código e reduz o número de erros. O uso direto do SQLite pode ser justificado em casos muito simples ou quando há requisitos específicos que o Room não consegue satisfazer.