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ť.