Room Database Nedir?
Room, Google tarafından Android Jetpack kütüphane ailesinin bir parçası olarak sunulan bir veritabanı kütüphanesidir. Temel amacı, Android uygulamalarında SQLite veritabanı kullanımını basitleştirmek ve daha sağlam hale getirmektir. SQLite ile doğrudan çalışmak, hem çok fazla tekrar eden kod yazmayı gerektirir hem de yazılan SQL sorgularının doğruluğunu ancak uygulama çalıştırıldığında test etme imkânı sunar. Bu da hatalara açık bir ortam yaratır. Room ise bu sorunları ortadan kaldırır. En büyük avantajlarından biri, yazdığınız SQL sorgularını program derlenirken kontrol etmesidir. Eğer sorgunuzda bir hata varsa, uygulama daha çalışmadan sizi uyarır ve hatayı düzeltmenizi sağlar. Bu özellik, geliştirme sürecini ciddi anlamda hızlandırır ve uygulamanın daha kararlı çalışmasına yardımcı olur.Room Mimarisi: Üç Ana Bileşen
Room kütüphanesi, anlaşılması ve kullanılması oldukça kolay olan üç temel bileşenden oluşur. Bu bileşenler bir araya gelerek veritabanı yapınızı oluşturur ve veri işlemlerini yönetmenizi sağlar.1. Entity (Varlık)
Entity, veritabanınızdaki bir tabloyu temsil eden basit bir veri sınıfıdır. Bu sınıfın her bir örneği (objesi), tablodaki bir satıra karşılık gelir. Örneğin, bir kullanıcı tablosu oluşturmak istiyorsanız, `Kullanici` adında bir Entity sınıfı tanımlarsınız. Bu sınıfın içinde kullanıcının ID'si, adı, e-posta adresi gibi bilgiler bulunur. Bir sınıfı Entity olarak işaretlemek için `@Entity` etiketini kullanmanız yeterlidir.Örnek bir `Not` Entity'si:
@Entity(tableName = "notlar_tablosu")
data class Not(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "baslik")
val baslik: String,
@ColumnInfo(name = "icerik")
val icerik: String
)
2. DAO (Data Access Object - Veri Erişim Nesnesi)
DAO, veritabanınıza nasıl erişeceğinizi tanımladığınız bir arayüzdür (interface). Veritabanına yeni veri ekleme (insert), mevcut veriyi güncelleme (update), veri silme (delete) veya veri sorgulama (query) gibi tüm işlemleri bu arayüz içindeki metotlar aracılığıyla tanımlarsınız. Room, `@Insert`, `@Delete`, `@Query` gibi basit etiketler sayesinde bu metotların ne iş yapacağını anlar ve gerekli tüm kodları arka planda kendisi oluşturur. Böylece karmaşık veritabanı bağlantı kodlarıyla uğraşmanıza gerek kalmaz.Örnek bir `NotDao` arayüzü:
@Dao
interface NotDao {
@Insert
suspend fun notEkle(not: Not)
@Query("SELECT * FROM notlar_tablosu ORDER BY id DESC")
fun tumNotlariGetir(): LiveData<List<Not>>
@Delete
suspend fun notSil(not: Not)
}
3. Database (Veritabanı)
Bu bileşen, veritabanının kendisini temsil eden ana sınıftır. `@Database` etiketi ile işaretlenen bu abstract (soyut) sınıf, `RoomDatabase` sınıfından türetilir. Bu sınıf içinde, veritabanında hangi Entity'lerin (tabloların) bulunacağını ve hangi DAO'ları kullanarak bu tablolara erişileceğini belirtirsiniz. Ayrıca veritabanının sürüm numarasını da burada yönetirsiniz. Uygulamanızın herhangi bir yerinden veritabanına erişmek istediğinizde bu sınıfı kullanırsınız.Room Database Kurulumu ve Kullanımı: Adım Adım Rehber
Teoriyi anladıktan sonra şimdi de projemize Room'u nasıl ekleyeceğimizi ve kullanacağımızı görelim.Adım 1: Gerekli Kütüphaneleri Ekleme
Öncelikle Android projenizin `build.gradle (Module: app)` dosyasına Room kütüphanelerini eklemeniz gerekir.
plugins {
id 'kotlin-kapt'
}
dependencies {
def room_version = "2.6.1"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// Kotlin Coroutines ile asenkron kullanım için
implementation "androidx.room:room-ktx:$room_version"
// Kapt'ı da eklemeyi unutmayın
kapt "androidx.room:room-compiler:$room_version"
}
Adım 2: Entity, DAO ve Database Sınıflarını Oluşturma
Yukarıdaki örneklerde gösterildiği gibi `Not` Entity'sini, `NotDao` arayüzünü ve bu ikisini birleştiren `AppDatabase` sınıfını projenizde oluşturun.Adım 3: Veritabanı Örneği (Instance) Oluşturma
Uygulamanızda veritabanına her erişim gerektiğinde yeni bir bağlantı oluşturmak performansı olumsuz etkiler. Bunu önlemek için veritabanı nesnesini "Singleton" deseniyle, yani uygulama boyunca tek bir örnek olacak şekilde oluşturmak en iyi yöntemdir.Room'un Avantajları Nelerdir?
Room kullanmanın getirdiği birçok fayda vardır. Bunları şu şekilde özetleyebiliriz:- Derleme Zamanı Güvenliği: Yazdığınız SQL sorgularını program derlenirken kontrol eder ve olası hataları anında bildirir.
- Azaltılmış Kod Tekrarı: Veri ekleme, silme, güncelleme gibi standart işlemler için tekrar tekrar aynı kodları yazmaktan kurtarır.
- Kolay Entegrasyon: LiveData, Flow ve Coroutines gibi modern Android bileşenleriyle sorunsuz bir şekilde entegre olur. Bu sayede veritabanı işlemlerini arka planda kolayca yapabilir ve sonuçları kullanıcı arayüzünde otomatik olarak güncelleyebilirsiniz.
- Test Edilebilirlik: Veritabanı mantığınızı test etmeyi oldukça kolaylaştırır.
- Veri Taşıma (Migration): Uygulamanızın yeni sürümlerinde veritabanı yapınız değiştiğinde (örneğin bir tabloya yeni bir sütun eklediğinizde), kullanıcıların eski verilerini kaybetmeden yeni sürüme geçmelerini sağlayan migration işlemlerini basitleştirir.
Sonuç ve İleri Adımlar
Android Room Database, modern uygulama geliştirme süreçlerinde veri yönetimi için vazgeçilmez bir araçtır. Sunduğu güvenlik, basitlik ve performans iyileştirmeleri sayesinde geliştiricilere büyük kolaylık sağlar. Bu yazıda Room'un temellerini öğrendiniz ve ilk adımı attınız. Artık kendi projelerinizde verileri kalıcı olarak saklamak için Room'u rahatlıkla kullanabilirsiniz. Daha karmaşık sorgular, ilişkisel veritabanı yapıları ve migration işlemleri gibi ileri düzey konular için resmi Android geliştirici dokümantasyonunu inceleyebilirsiniz. Harika bir uygulama geliştirdikten sonraki adımınız, onu dünyayla paylaşmaktır. Bu aşamada, uygulamanızı yayınlamak için bir Android geliştirici hesabı açma adımlarını öğrenmek isteyebilirsiniz.S: Room, SQLite'ın yerini mi alıyor?
C: Hayır, tam olarak değil. Room, SQLite'ın üzerine inşa edilmiş bir katmandır. Aslında arka planda yine SQLite çalışır. Room'un amacı, SQLite kullanımını çok daha kolay ve hatasız hale getirmektir.
S: Room kullanmak zorunlu mu?C: Hayır, zorunlu değil. İsterseniz doğrudan SQLite API'lerini kullanmaya devam edebilirsiniz. Ancak Room'un sağladığı kolaylıklar ve güvenlik nedeniyle yeni projeler için şiddetle tavsiye edilmektedir.
S: Room ile hangi tür verileri saklayabilirim?C: Room, metin (String), sayı (Int, Float), tarih gibi temel veri türlerini doğrudan saklayabilir. Resim gibi karmaşık verileri saklamak için bu verileri temel türlere dönüştüren `TypeConverter` sınıfları yazmanız gerekir.
S: Veritabanı sürümünü yükseltmek (migration) nasıl yapılır?C: Veritabanı şemanız değiştiğinde (örneğin bir tabloya yeni sütun eklediğinizde), `@Database` etiketindeki `version` numarasını artırmanız ve bir `Migration` sınıfı oluşturarak eski versiyondan yeni versiyona nasıl geçileceğini belirten SQL komutlarını yazmanız gerekir.
S: Room'un performansı nasıl?C: Room, doğru kullanıldığında oldukça performanslıdır. Arka planda verimli sorgular oluşturur. Özellikle sorgu işlemlerini ana iş parçacığı (main thread) yerine Coroutines veya LiveData gibi yapılarla arka planda yapmak, uygulama performansını yüksek tutar.
S: DAO içinde karmaşık sorgular yazabilir miyim?C: Evet. `@Query` etiketi, karmaşık `SELECT` sorguları, `JOIN` işlemleri ve parametreli sorgular yazmanıza olanak tanır. Room bu sorguları derleme zamanında kontrol ederek doğruluğundan emin olmanızı sağlar.
S: Room sadece Kotlin ile mi kullanılır?C: Hayır. Room, hem Kotlin hem de Java dilleriyle tam uyumlu çalışır. Kotlin, Coroutines gibi modern özellikler sayesinde daha akıcı bir kullanım sunsa da Java ile de tüm özelliklerinden faydalanabilirsiniz.
