Sobes.tech
Junior

Room ile SQLite arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

SQLite, Android'a gömülü hafif bir ilişkisel veritabanıdır. Room, SQLite üzerinde soyutlama sağlayan ve veritabanıyla çalışma için daha yüksek seviyeli bir API sunan bir kütüphanedir; etkileşimi basitleştirir ve hata olasılığını azaltır.

Ana farklar:

  • ORM: Room, POJO sınıfları şeklinde verilerle çalışmaya izin veren bir ORM'dir (Object-Relational Mapper), doğrudan tablolar ve sütunlar yerine.
  • Derleme zamanında kontroller: Room, uygulama çalıştırılmadan önce sözdizimi hatalarını ve veri tipi uyuşmazlıklarını tespit eden veritabanı sorgularını derleme sırasında kontrol eder.
  • Kodun basitleştirilmesi: Room, veritabanıyla çalışma için boilerplate kodu otomatik olarak üretir (örneğin, POJO'yu tablo satırlarına dönüştürmek ve tersi), bu da manuel kod miktarını önemli ölçüde azaltır.
  • LiveData ve Flow desteği: Room, Android Architecture Components'taki LiveData ve Flow gibi bileşenlerle entegre olur, asenkron işlemlerle çalışma ve veri değişikliklerini izleme işlemlerini kolaylaştırır.
  • Göçler: Room, şema değişiklikleri sırasında veritabanı göçlerini kolayca yapmanızı sağlayan bir mekanizma sunar.

Room kullanımı örneği:

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

// DAO (Veri Erişim Nesnesi)
@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAllUsers(): List<User>

    @Insert
    fun insertUser(user: User)
}

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

SQLite'ı doğrudan SQLiteOpenHelper ile kullanma örneği:

// Veritabanı yardımcı sınıfı
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
    }
}

// Veri ekleme örneği
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()
Özellikler Room SQLite (doğrudan)
Tür ORM (Soyutlama Kütüphanesi) İlişkisel veritabanı
Veri ile çalışma Nesneler (POJO) Satırlar ve sütunlar
Kontroller Derleme zamanında Çoğunlukla çalışma zamanında
Boilerplate kod Otomatik olarak üretilir Manuel yazılması gerekir
AAC ile entegrasyon Evet (LiveData, Flow) Hayır
Göçler Kullanışlı API Manuel uygulama gerekir
Kullanım kolaylığı Yüksek Daha düşük, hata yapma olasılığı daha yüksek

Room kullanımı, yeni geliştirmelerde tercih edilir çünkü veritabanıyla çalışma sürecini önemli ölçüde basitleştirir, kodun güvenilirliğini artırır ve hata sayısını azaltır. SQLite'ın doğrudan kullanımı, çok basit durumlar veya Room'un karşılayamadığı özel gereksinimler için gerekebilir.