Android Room Database Kullanımı
Room bir ORM (Object Relational Mapping) kütüphanesidir. ORM, kod blokları ile veri tabanı arasında oluşan bir köprüdür. Room, veri tabanında oluşturulan alanları Java nesnelerine dönüştürmeyi sağlar. En yaygın kullanım durumu, ilgili verileri ön belleğe almaktadır. Böylece, cihaz ağa erişemediğinde kullanıcı çevrimdışıyken içeriğe erişebilir.
Room kütüphanesi, SQLite veri tabanı üzerinde bir soyutlama katmanı sağlar.
Room kullanmanın avantajları:
- Her
@Query
ve@Entity
derleme zamanında kontrol edilir, bu da uygulamanızı çalışma zamanında çökme sorunlarından korur ve yalnızca sözdizimini değil, aynı zamanda eksik tabloları da kontrol eder. - Tekrarlayan ve hataya açık standart kod yazmayı en aza indirir
- Diğer mimari bileşenlerle kolayca entegre edilir (LiveData, ViewModel vb.)
Sağladığı kolaylıklar nedeni ile Android tarafından doğrudan SQLite kullanılması yerine Room kullanılması önerilir.
Room Database 3 ana bileşene sahiptir.
1. Entity
2. Dao
3. Database Sınıfı
1. Entity
Veri tabanı içindeki bir tabloyu temsil eder. Room, @Entity
anotasyonuna sahip her sınıf için bir tablo oluşturur, sınıfta bulunan alanlar tablodaki sütunlara karşılık gelir.
Entity Anotasyonları
Entityleri modellemeye başlamadan önce, bazı yararlı anotasyonları ve özniteliklerini bilmemiz gerekir.
@Entity — Bu anotasyona sahip her model sınıfının DB’de bir mapping tablosu olacaktır.
@PrimaryKey— Adından da anlaşılacağı gibi, bu anotasyon Entity’nin birincil anahtarına işaret eder. autoGenerate true olarak ayarlanırsa, SQLite sütun için benzersiz bir kimlik oluşturacaktır.
@PrimaryKey(autoGenerate = true)
@ColumnInfo— Sütun hakkında özel bilgilerin belirlenmesine izin verir.
@ColumnInfo(name = “column_name”)
@Embeded— İç içe geçmiş alanlara doğrudan SQL sorgularında başvurulabilir.
2. DAO
DAO, SQL sorgularını belirtir. Veri tabanındaki verileri sorgulamak, güncellemek, eklemek ve silmek için yöntemler sağlar.
- DAO bir interface veya abstract bir sınıf olmalıdır.
3. Database Sınıfı
Veri tabanını tutan ve uygulamanızın kalıcı verilerine temel bağlantı için ana erişim noktası görevi gören veri tabanı sınıfıdır. Bir veri tabanı oluşturmak için RoomDatabase’i extend eden abstract bir sınıf tanımlamamız gerekir. Bu sınıf @Database
anotasyonuna sahip olmalıdır.
Database sınıfı aşağıdaki koşulları sağlamalıdır:
- RoomDatabase’i extend eden abstract bir sınıf olmak zorundadır.
- Veri tabanıyla ilişkili Entity’lerin listesi anotasyon olarak eklenmelidir.

Database sınıfı, uygulamanıza bu veri tabanıyla ilişkili DAO örneklerini sağlar. DAO’lar ise veri tabanından Entity’leri almak için kullanabilir. Uygulama, ilgili tablolardan satırları güncellemek veya eklemek üzere yeni satırlar oluşturmak için tanımlanmış veri Entity’lerini de kullanabilir.
Room Örneği
1. Adım: Gradle Bağımlılıklarının Ekleyin
Öncelikle build.gradle
dosyasında bulunan plugins bloklarının içerisine kotlin kapt eklemelidir.
Projenize Room kütüphanesini eklemek için dependencies blokları arasına aşağıdaki satırları ekleyin:
2. Adım: Model Sınıfı Oluşturun
Room, @Entity
anotasyonu bulunan her sınıf için bir tablo oluşturur; sınıftaki alanlar tablodaki sütunlara karşılık gelir. Bu nedenle, Entity sınıfları herhangi bir mantık içermeyen küçük model sınıfları olma eğilimindedir.
Örnek olarak bir Word Sınıfı oluşturalım. Örnek uygulamanın verileri girilen kelimelerdir ve bu değerleri tutmak için basit bir tabloya ihtiyacınız olacaktır.

Word adında yeni bir data sınıfı oluşturun.
Word Sınıfı:
Word sınıfını Room veri tabanı için anlamlı kılmak için anotasyonlar eklenmesi gerekir. Anotasyonlar, Word sınıfının her bir bölümünün veri tabanındaki bir girişle nasıl ilişkili olduğunu tanımlar.
Anotasyonları inceleyelim:
@Entity(tableName="word_table")
Her @Entity sınıfı bir SQLite tablosunu temsil eder. Tablonun adının oluşturduğunuz sınıf adından farklı olmasını istiyorsanız tablo adını belirtebilirsiniz. Burada tablo adıword_table
olarak adlandırılır.@PrimaryKey
Her Entity’nin bir primary key’e ihtiyacı vardır. Bu örnekte zaten bir alan bulunduğu için word alanı primary key olarak tanımlanmıştır.@ColumnInfo(name="word")
Tablodaki alanın değişken adından farklı olmasını istiyorsanız alan adını değiştirebilirsiniz. Burada “word” olarak adlandırılmıştır.
📝 NOT
Primary keye aşağıdaki gibi anotasyon ekleyerek benzersiz anahtarları otomatik olarak oluşturabilirsiniz:
@PrimaryKey(autoGenerate=true)
3. Adım: DAO Oluşturun
Aşağıdaki sorguları sağlayan DAO oluşturalım:
- Alfabetik olarak sıralanan tüm kelimeleri alma
- Kelime ekleme
- Kelime silme
1. WordDao adında yeni bir kotlin sınıfı oluşturun.
2. Aşağıdaki kodu DAO sınıfının içerisine ekleyin.
DAO sınıfını inceleyelim:
- WordDao bir interface’dir; DAO’lar interface veya abstract olmalıdır.
- @Dao anotasyonu belirtilen sınıfı Room için bir DAO sınıfı olarak tanımlar.
- @Insert anotasyonu, herhangi bir SQL sorgusu oluşturmanızı gerektirmeyen özel bir anotasyondur. (Satırları silmek için @Delete, güncellemek için @Update anotasyonları da vardır)
onConflit = OnConflictStrategy.IGNORE
Seçilen onConflict stratejisi, listedeki ile tamamen aynı bir alan varsa yeni girilen alanı yok sayar.- Birden fazla alanı silmek için bir anotasyon yoktur, bu nedenle @Query anotasyonu eklenerek sorgu yazılmıştır.
4. Adım: Room Veritabanı Oluşturun
Yeni bir veri tabanı oluşturmak için öncelikle RoomDatabase
sınıfını extend eden bir abstract sınıf oluşturulması gerekir. WordRoomDatabase
adında bir kotlin sınıfı oluşturun ve aşağıdaki satırları ekleyin:
Kodu inceleyelim:
- Veri tabanı abstract ve RoomDatabase’i extend etmelidir
- Sınıfın veri tabanı olduğunu belirten
@Database
anotasyonu eklenir ve veri tabanına ait entityleri ve sürüm numarasını ayarlamak için anotasyon parametreleri kullanılır. - Her DAO sınıfı için abstract bir
getter
methodu oluşturulmalıdır. - Veri tabanının birden çok örneğinin aynı anda açılmasını önlemek için Singleton WordRoomDatabase tanımladık. Singleton, sistem çalıştığı sürece nesnenin tek bir defa oluşturulacağını garantilemek için kullanılır.
getDatabase
methodu singleton bir veri tabanı nesnesi döndürür. Veritabanı nesnesine ilk kez erişildiğindeDatabaseBuilder
kullanılarakword_database
adında veri tabanı oluşturulur.
5. Adım: Verileri Yönetin
Verileri yönetmek için öncelikle veri tabanının bir nesnesini oluşturmanız gerekir. Daha sonra veri ekleme, silme gibi işlemleri gerçekleştirebilirsiniz.
Kodu inceleyelim:
- WordRoomDatabase sınıfından nesne oluşturulduktan sonra DAO’ya erişerek CRUD işlemleri gerçekleştirilmelidir.
- Room Database, düşük UI performansından kaçınmak için main thread üzerinde sorgu göndermenize izin vermez. Bu yüzden main threadi kitlememek ve kesintisiz akışı kesmemek için coroutineler kullanılmaktadır. Coroutine başlatmak için coroutine builder kullanılmaktadır. Launch, mevcut iş parçacığını engellemeden bir coroutine başlatan coroutine builder olarak tanımlanır. Suspend fonksiyonlar ise mevcut threadi bloklamadan askıya alınma işlevini sağlarlar. Ayrıca suspend fonksiyonlar coroutine üzerinden çağırılır.
- Uygulama çalıştırıldığında Hello kelimesi veri tabanında bulunan
word_table
tablosuna eklenecektir. - Kelimenin eklenip eklenmediğini göstermek için
listData
fonksiyonu çalıştırılarak veriler Log’da gösterilmiştir. Log’daD/list:[Word(word=Hello)
şeklinde görebilirsiniz.
Herkese iyi çalışmalar dilerim.