Junior
У чему се састоји разлика између Room и SQLite?
sobes.tech АИ
Одговор од АИ
SQLite je lagana relacijska baza podataka ugrađena u Android. Room je biblioteka apstrakcije nad SQLite, koja pruža višeslojni API za rad s bazom podataka, pojednostavljujući interakciju i smanjujući verovatnoću grešaka.
Glavne razlike:
- ORM: Room je ORM (Object-Relational Mapper), koji omogućava rad s podacima u obliku POJO klasa, a ne direktno s tabelama i kolonama.
- Provere pri kompilaciji: Room vrši provere upita tokom kompilacije, otkrivajući sintaksne greške i nesklade u tipovima podataka pre pokretanja aplikacije.
- Pojednostavljenje koda: Room automatski generiše boilerplate kod za rad s bazom podataka (npr. za konverziju POJO u redove tabele i obrnuto), čime značajno smanjuje količinu ručno napisanog koda.
- Podrška za LiveData i Flow: Room se integriše s komponentama Android Architecture, kao što su LiveData i Flow, olakšavajući rad s asinhronim operacijama i praćenje promena podataka.
- Migracije: Room pruža zgodan mehanizam za izvršavanje migracija baze podataka pri promeni šeme.
Primer korišćenja Room:
// Entitet
@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 podataka
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Primer direktne upotrebe SQLite sa SQLiteOpenHelper:
// Pomoćnik za bazu podataka
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
}
}
// Primer umetanja podataka
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()
| Karakteristika | Room | SQLite (direktno) |
|---|---|---|
| Tip | ORM (biblioteka apstrakcije) | Relaciona baza podataka |
| Rad sa podacima | Objekti (POJO) | Redovi i kolone |
| Provere | Tokom kompilacije | Uglavnom tokom izvršenja |
| Boilerplate kod | Automatski generisan | Potreban ručni unos |
| Integracija sa AAC | Da (LiveData, Flow) | Ne |
| Migracije | Praktičan API | Potrebna ručna implementacija |
| Laka upotreba | Visoka | Niža, sklonija greškama |
Korišćenje Room je u većini slučajeva poželjno za novu razvojnu fazu, jer znatno pojednostavljuje rad s bazom podataka, povećava pouzdanost koda i smanjuje broj grešaka. Direktno korišćenje SQLite može biti opravdano u vrlo jednostavnim slučajevima ili kod specifičnih zahteva koje Room ne može da zadovolji.