Sobes.tech
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.