Sobes.tech
Junior

V čem spočívá rozdíl mezi Room a SQLite?

sobes.tech AI

Odpověď od AI

SQLite je lehká relační databáze zabudovaná v Androidu. Room je knihovna abstrakce nad SQLite, která poskytuje vyšší úroveň API pro práci s databází, zjednodušuje interakci a snižuje pravděpodobnost chyb.

Hlavní rozdíly:

  • ORM: Room je ORM (Object-Relational Mapper), který umožňuje pracovat s daty ve formě POJO tříd, nikoli přímo s tabulkami a sloupci.
  • Kontroly při kompilaci: Room provádí kontroly dotazů při kompilaci, odhaluje syntaktické chyby a nesoulad typů dat před spuštěním aplikace.
  • Zjednodušení kódu: Room automaticky generuje boilerplate kód pro práci s databází (například převod POJO na řádky tabulky a zpět), což výrazně snižuje množství ručního kódu.
  • Podpora LiveData a Flow: Room se integruje s komponentami Android Architecture, jako jsou LiveData a Flow, což usnadňuje práci s asynchronními operacemi a sledování změn dat.
  • Migrace: Room nabízí pohodlný mechanismus pro provádění migrací databáze při změně její schématu.

Příklad použití 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áze
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Příklad přímého použití SQLite s SQLiteOpenHelper:

// Pomocník pro databázi
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
    }
}

// Příklad vkládání dat
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 (přímo)
Typ ORM (knihovna abstrakce) Relační databáze
Práce s daty Objekty (POJO) Řádky a sloupce
Kontroly Při kompilaci Převážně při běhu
Boilerplate kód Automaticky generován Vyžaduje ruční psaní
Integrace s AAC Ano (LiveData, Flow) Ne
Migrace Pohodlné API Vyžaduje ruční implementaci
Snadnost použití Vysoká Nižší, náchylnější k chybám

Použití Room je v většině případů preferováno pro novou vývoj, protože výrazně zjednodušuje práci s databází, zvyšuje spolehlivost kódu a snižuje počet chyb. Přímé použití SQLite může být odůvodněné v velmi jednoduchých případech nebo při specifických požadavcích, které Room nemůže splnit.