Sobes.tech
Junior

Mis vahe on Room ja SQLite vahel?

sobes.tech AI

Vastus AI-lt

SQLite on kerge relatsiooniline andmebaas, mis on Android-i sisseehitatud. Room on SQLite-i peal põhinev abstraktsiooniraamatukogu, mis pakub kõrgema taseme API andmebaasiga töötamiseks, lihtsustades suhtlust ja vähendades vigade tõenäosust.

Peamised erinevused:

  • ORM: Room on ORM (Object-Relational Mapper), mis võimaldab töötada andmetega POJO klasside kaudu, mitte otse tabelite ja veergude:
  • Kompileerimise kontrollid: Room teostab andmebaasi päringute kontrollid kompileerimise ajal, avastades süntaksivigu ja andmetüüpide sobimatust enne rakenduse käivitamist:
  • Koodi lihtsustamine: Room genereerib automaatselt boilerplate-koodi andmebaasiga töötamiseks (näiteks POJO-de teisendamine ridadeks ja vastupidi), mis oluliselt vähendab käsitsi kirjutatud koodi hulka:
  • LiveData ja Flow tugi: Room integreerub Android Architecture Components-idega, nagu LiveData ja Flow, lihtsustades asünkroonsete operatsioonide ja andmete muutuste jälgimist:
  • Migreerimised: Room pakub mugavat mehhanismi andmebaasi skeemi muutmiseks migratsioonide teostamiseks:

Näide Room kasutamisest:

// Olend
@Entity
data class User(
    @PrimaryKey val userId: Int,
    val name: String,
    val age: Int
)

// DAO (Andmete ligipääsu objekt)
@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAllUsers(): List<User>

    @Insert
    fun insertUser(user: User)
}

// Andmebaas
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Näide otse SQLite kasutamisest SQLiteOpenHelper-i kaudu:

// Andmebaasi abiline
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
    }
}

// Andmete sisestamise näide
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()
Omadus Room SQLite (otsene)
Tüüp ORM (abstraktsiooniraamatukogu) Reltatsiooniline andmebaas
Andmetega töötamine Objekti (POJO) Ridad ja veerud
Kontrollid Kompileerimise ajal Peamiselt runtime
Boilerplate kood Automaatselt genereeritud Nõuab käsitsi kirjutamist
Integratsioon AAC-ga Jah (LiveData, Flow) Ei
Migreerimised Mugav API Nõuab käsitsi teostamist
Kasutamise lihtsus Kõrge Madalam, kalduv vigu

Room-i kasutamine on enamasti soovitatav uutes projektides, kuna see oluliselt lihtsustab andmebaasiga töötamist, suurendab koodi usaldusväärsust ja vähendab vigu. SQLite otse kasutamine võib olla põhjendatud väga lihtsates juhtumites või spetsiifiliste nõuete korral, mida Room ei suuda rahuldada.