Android Room: Local Database

Pelşin KAPLAN
Finagotech
Published in
3 min readJun 16, 2022

Herkese merhaba, bu yazımda Android’de Room kullanarak nasıl yerel bir database kuracağımızı konuşacağız.

Yazdığınız uygulamaları düşünün, çoğunda depolanması gereken veriler bulunuyor ve uygulama kapansa bile bu verilerin tutulması gerekiyor ki daha sonra kullanılabilsin. Tam bu noktada Android bize bir çok seçenek sunuyorken içlerinden en çok tercih edilenlerden biri olan Room’la tanışmaya gidiyoruz.

Neymiş bu Room? SQLite ile database işlemlerini çok kolay bir şekilde gerçekleştirebileceğimiz bir Jetpack kütüphanesi. Kolay ve anlaşılırdır. Yani bizi kod kalabalığından kurtarır. SQL sorgularının derleme zamanındaki doğrulamasını sağlar. Aynı zamanda RxJava, LiveData ve Coroutines gibi yapılarla kolayca entegre olabilmesi başlıca avantajları arasındadır.

Şimdi örnek bir proje üzerinden ilerleyerek nasıl implement edeceğimizi öğrenelim. Direkt olarak oluşturduğum projenin gradle dosyasına gidiyorum ve gerekli depencenyleri ekliyorum.

Şimdi database bir şeyler ekleyeceğiz de neye göre nasıl bir formatta ekleyeceğiz? Database’e ekleyeceğimiz verilerin modellerine ihtiyacımız var. Data class şeklinde modelimizi oluşturup, gerekli annotationları ekliyoruz. Bu annotationlar neymiş ufacık göz atalım:

  • Entity: Modelimin bir tablo olduğunu Room’a söylemek için bu annotationu kullanıyoruz ve data classımın başına ekliyoruz. Yanına da databasede oluşturulacak olan tablonun ismini belirtmek için tablename argümanını kullanıyoruz. Eğer bu argümanı kullanmazsak, tablonun ismi model sınıfının ismi ile aynı olacaktır. (Android belirtilmesini tavsiye ediyor.)
  • ColumnInfo: Fieldların isimlerini özelleştirmek için kullanılan opsiyonel bir annotationdır. Yanına name argümanını kullanarak sütun adı girebiliriz.
  • PrimaryKey: Tablomuzdaki primary key filedını belirtmek için kullandığımız bir başka annotation. Bu annotation’ın yanına autoGenerate argümanını true değeri verirsek tablodaki verilerin idleri otomatik artan bir yapı kazanmış olur.

Modelimi oluşturmaya ve gerekli annotationları eklemeye başlıyorum o zaman. Product database’i kurmayı düşünüyorum, o yüzden Product adı ile bir data class oluşturup içini aşağıdaki gibi dolduruyorum.

Modelimiz hazır, o zaman bu ekip buradan Room’u kullanmaya geçiyor. DAO(Data Access Object) interface classımızı oluşturmakla başlayalım işe, bu class adından da anlayabileceğiniz üzere database’deki verilere erişmek, değişiklik yapmak, silmek ya da SQL sorgularını uygulamak için kullanılır. Bu classta da kullanmamız gereken bazı annotationlar var. Neymiş nelermiş bunlar hadi beraber bakalım.

  • Dao: Sınıfın bir DAO olduğunu bildirir.
  • Insert: Tablomuza veri ekleyeceğimiz zaman kullanmamız gereken annotationdır.
  • Query: Tablo ile alakalı spesifik bir sorgu yazmak istiyorsak kullanmamız gereken annotationdır. Mesela belirli bir id’ye sahip bir verinin alınması gibi durumlarda tercih edilir. Parantezler içerisine SQL sorgusu yazılarak kullanılır.
  • Update: Tablodaki bir veriyi güncellemek istediğimizde kullandığımız annotationdır.
  • Delete: Tablodaki bir veriyi silmek istediğimizde kullandığımız annotationdır.

Şimdi bu annotationları kullanarak kendi DAO’muzu oluşturalım. Product database’i demiştik, o zaman DAO’yu da product ile ilgili olan işlemlerle dolduruyorum hemen.

Şimdi de Room database kurmak için son ihtiyacım olan şeye geldi sıra: Database classı. Database’imizi bu class içerisinde oluşturacağız. Oluşturduğumuz Entitiyi bu class içinde belirtecek ve DAO’yu bu class içerisinde kuracağız. Önce kullanacağımızı annotationlar hakkında ufak bir özet geçelim. Çoğul konuştum ama bir tanecik var :D

  • Database: Classın database classı olduğunu belirtmek için kullandığımız annotationdır. Yanına da argüman olarak entities ve version eklenebilir. Bu annotationı classın üstüne eklememiz gerekir. Eklediğimiz argümanların ne olduğuna da ufak bir bakalım.
  • Entites, entitiy modellerimizi belirteceğimiz kısımdır.
  • Version, database’e ait versiyonu belirteceğimiz kısımdır. Daha sonra database değişiklik olması durumunda verison kısmını güncellemeniz gerektiğini de söylemiş olayım :)

Şimdi database classımı yazmaya geldi sıra. Abstract classımı kurmakla işe başlıyorum ve RoomDatabase classını extend ediyorum. Tek nesne oluşturmak istediğim için companion object blokları arasına database’imi get edecek bir metod yazıyorum. Anlarsınız ya Singelton ;) Room classı ile databaseimi build ediyorum ve oluşturduğum intanceı return ediyorum. Ortaya aşağıdaki gibi bir sonuç çıkıyor :D

Eveett, database artık kuruldu, peki bununla nasıl iletişime geçeceğiz nasıl kullanacağız? Product Database classında yazdığım getProductDatabase( ) metotu üzerinden erişip bana return ettiği instance ile getProductDao() metodunu kullanarak gerekli DAO metodlarıma ulaşabiliyorum. E ne dedim şimdi ben :D Hadi gelin uygulamalı görelim. Hepsinden bir adet olmak üzere insert, update, delete ve get işlemi yapacağım. Sonrasında nasıl kullanmak istediğiniz de size kalmış.

Bu kodun çıktısı da aşağıdaki şekilde. Siz yapacağınız uygulamaya göre UI ile birleştirip ona göre bir database kurabilirsiniz.

İşinize yaradıysa ne mutlu bana deyip projenin github linkini buraya bırakıyorum. Mutlu sağlıklı kodlamalı günler :)

--

--