Sobes.tech
Junior

¿En qué consiste la diferencia entre Room y SQLite?

sobes.tech AI

Respuesta de la IA

SQLite es una base de datos relacional ligera integrada en Android. Room es una biblioteca de abstracción sobre SQLite que proporciona una API de nivel superior para trabajar con bases de datos, simplificando la interacción y reduciendo la probabilidad de errores.

Diferencias principales:

  • ORM: Room es un ORM (Object-Relational Mapper), que permite trabajar con datos en forma de clases POJO, en lugar de directamente con tablas y columnas.
  • Verificaciones en tiempo de compilación: Room realiza verificaciones de consultas a la base de datos durante la compilación, detectando errores de sintaxis y discrepancias en los tipos de datos antes de ejecutar la aplicación.
  • Simplificación del código: Room genera código boilerplate para trabajar con la base de datos (por ejemplo, para convertir POJO en filas de la tabla y viceversa), lo que reduce significativamente la cantidad de código manual.
  • Soporte para LiveData y Flow: Room se integra con componentes de Android Architecture Components, como LiveData y Flow, facilitando el trabajo con operaciones asíncronas y la observación de cambios en los datos.
  • Migraciones: Room proporciona un mecanismo conveniente para realizar migraciones de la base de datos al cambiar su esquema.

Ejemplo de uso de Room:

// Entidad
@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 datos
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Ejemplo de uso directo de SQLite con SQLiteOpenHelper:

// Helper para la base de datos
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
    }
}

// Ejemplo de inserción de datos
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 (directamente)
Tipo ORM (biblioteca de abstracción) Base de datos relacional
Trabajo con datos Objetos (POJO) Filas y columnas
Verificaciones En tiempo de compilación Principalmente en tiempo de ejecución
Código boilerplate Generado automáticamente Requiere escritura manual
Integración con AAC Sí (LiveData, Flow) No
Migraciones API conveniente Requiere implementación manual
Facilidad de uso Alta Menor, más propenso a errores

El uso de Room es preferido en la mayoría de los casos para desarrollo nuevo, ya que simplifica significativamente el trabajo con la base de datos, aumenta la fiabilidad del código y reduce la cantidad de errores. El uso directo de SQLite puede ser justificado en casos muy simples o cuando se tienen requisitos específicos que Room no puede satisfacer.