Sobes.tech
Junior

Care este diferența dintre Room și SQLite?

sobes.tech AI

Răspuns de la AI

SQLite — este o bază de date relațională ușoară, integrată în Android. Room este o bibliotecă de abstractizare peste SQLite, oferind un API de nivel mai înalt pentru lucrul cu baza de date, simplificând interacțiunea și reducând probabilitatea de erori.

Diferențele principale:

  • ORM: Room este un ORM (Object-Relational Mapper), permițând lucrul cu datele sub formă de clase POJO, nu direct cu tabele și coloane.
  • Verificări la compilare: Room efectuează verificări ale interogărilor la compilare, detectând erori de sintaxă și incompatibilități de tipuri de date înainte de rularea aplicației.
  • Simplificarea codului: Room generează cod boilerplate pentru lucrul cu baza de date (de exemplu, pentru conversia POJO-urilor în rânduri de tabel și invers), reducând semnificativ cantitatea de cod manual.
  • Suport pentru LiveData și Flow: Room se integrează cu componentele Android Architecture Components, precum LiveData și Flow, facilitând lucrul cu operațiuni asincrone și monitorizarea modificărilor de date.
  • Migrații: Room oferă un mecanism convenabil pentru efectuarea migrărilor bazei de date atunci când schema acesteia se schimbă.

Exemplu de utilizare Room:

// Entitate
@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)
}

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

Exemplu de utilizare directă a SQLite cu SQLiteOpenHelper:

// Helper pentru baza de date
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
    }
}

// Exemplu de inserare de date
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()
Caracteristică Room SQLite (direct)
Tip ORM (bibliotecă de abstractizare) Bază de date relațională
Lucru cu datele Obiecte (POJO) Rânduri și coloane
Verificări La compilare În principal la runtime
Cod boilerplate Generat automat Necesită scriere manuală
Integrare cu AAC Da (LiveData, Flow) Nu
Migrații API convenabil Necesită implementare manuală
Ușurința utilizării Ridicată Mai scăzută, mai predispus la erori

Utilizarea Room este preferabilă în majoritatea cazurilor pentru dezvoltarea nouă, deoarece simplifică semnificativ lucrul cu baza de date, crește fiabilitatea codului și reduce numărul de erori. Utilizarea directă a SQLite poate fi justificată în cazuri foarte simple sau în condiții speciale pe care Room nu le poate satisface.