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.