Sobes.tech
Junior

Kuo skiriasi Room nuo SQLite?

sobes.tech AI

Atsakymas iš AI

SQLite — tai lengvas reliacinės duomenų bazės sprendimas, įmontuotas Android. Room — tai abstrakcijos biblioteka virš SQLite, suteikianti aukštesnio lygio API darbui su duomenų baze, supaprastinanti sąveiką ir sumažinanti klaidų tikimybę.

Pagrindiniai skirtumai:

  • ORM: Room yra ORM (Object-Relational Mapper), leidžianti dirbti su duomenimis POJO klasėmis, o ne tiesiogiai su lentelėmis ir stulpeliais:
  • Kompiliacijos patikrinimai: Room atlieka duomenų bazės užklausų patikrinimus kompiliacijos metu, aptinka sintaksės klaidas ir duomenų tipų neatitikimus prieš programos paleidimą:
  • Kodo supaprastinimas: Room automatiškai generuoja boilerplate kodą darbui su duomenų baze (pavyzdžiui, POJO konvertavimą į eilutes ir atvirkščiai), tai žymiai sumažina rankinio kodo kiekį:
  • LiveData ir Flow palaikymas: Room integruojasi su Android Architecture Components, tokiais kaip LiveData ir Flow, supaprastina asinchroninių operacijų ir duomenų pokyčių stebėjimą:
  • Migracijos: Room siūlo patogų mechanizmą duomenų bazės schemos keitimams vykdyti migracijas:

Naudojimo pavyzdys — Room:

// Entitetas
@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)
}

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

Pavyzdys naudojant tiesiogiai SQLite su SQLiteOpenHelper:

// Duomenų bazės pagalbininkas
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
    }
}

// Duomenų įterpimo pavyzdys
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()
Savybė Room SQLite (tiesiogiai)
Tipas ORM (abstrakcijos biblioteka) Relyacinė duomenų bazė
Duomenų tvarkymas Objektais (POJO) Eilutėmis ir stulpeliais
Patikrinimai Kompiliacijos metu Pagrinde runtime
Boilerplate kodas Automatiškai generuojamas Reikalauja rankinio rašymo
Integracija su AAC Taip (LiveData, Flow) Ne
Migracijos Patogus API Reikalauja rankinio įgyvendinimo
Naudojimo paprastumas Aukštas Žemesnis, linkęs į klaidas

Room naudojimas dažniausiai yra pageidautinas naujuose projektuose, nes jis žymiai supaprastina darbą su duomenų baze, didina kodo patikimumą ir mažina klaidų skaičių. Tiesioginis SQLite naudojimas gali būti pateisinamas labai paprastais atvejais arba specifinėse reikmėse, kurias Room nepatenkina.