Sobes.tech
Junior

V čom spočíva rozdiel medzi Room a SQLite?

sobes.tech AI

Odpoveď od AI

SQLite je ľahká relačná databáza zabudovaná v Android. Room je knižnica abstrakcie nad SQLite, ktorá poskytuje vyššiu úroveň API pre prácu s databázou, zjednodušuje interakciu a znižuje pravdepodobnosť chýb.

Hlavné rozdiely:

  • ORM: Room je ORM (Object-Relational Mapper), ktorý umožňuje pracovať s dátami vo forme POJO tried, nie priamo s tabuľkami a stĺpcami.
  • Kontroly pri kompilácii: Room vykonáva kontroly dotazov počas kompilácie, odhaľuje syntaktické chyby a nesúlad v typoch dát pred spustením aplikácie.
  • Zjednodušenie kódu: Room automaticky generuje boilerplate kód pre prácu s databázou (napríklad, na konverziu POJO na riadky tabuľky a späť), čím výrazne znižuje množstvo ručne písaného kódu.
  • Podpora pre LiveData a Flow: Room sa integruje s komponentami Android Architecture, ako sú LiveData a Flow, čo uľahčuje prácu s asynchrónnymi operáciami a sledovanie zmien v dátach.
  • Migrácie: Room poskytuje pohodlný mechanizmus na vykonávanie migrácií databázy pri zmene jej schémy.

Príklad použitia Room:

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

// Databáza
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Príklad priameho použitia SQLite s SQLiteOpenHelper:

// Pomocník pre databázu
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
    }
}

// Príklad vkladania dát
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()
Charakteristika Room SQLite (priamo)
Typ ORM (knižnica abstrakcie) Relačná databáza
Práca s dátami Objekty (POJO) Riadky a stĺpce
Kontroly Pri kompilácii Väčšinou pri behu
Boilerplate kód Automaticky generovaný Vyžaduje ručné písanie
Integrácia s AAC Áno (LiveData, Flow) Nie
Migrácie Pohodlné API Vyžaduje ručnú implementáciu
Jednoduchosť použitia Vysoká Nižšia, náchylná na chyby

Použitie Room je v väčšine prípadov preferované pre novú vývoj, pretože výrazne zjednodušuje prácu s databázou, zvyšuje spoľahlivosť kódu a znižuje počet chýb. Priame použitie SQLite môže byť odôvodnené v veľmi jednoduchých prípadoch alebo pri špecifických požiadavkách, ktoré Room nedokáže splniť.