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.