9 Mart 2024·3 dk okuma
Room Kütüphanesi Kullanımı Üzerine

Neden Room?
Herhangi bir mobil uygulamada veriler önemlidir. Kullanıcı bilgileri, uygulama ayarları, oyun skorları gibi çeşitli veriler yerel olarak saklanabilir. Android’de bu verileri saklamak için SQLite kullanılır. Ancak, SQLite doğrudan kullanıldığında karmaşık ve hataya açık bir yapı ortaya çıkar. İşte burada Room devreye girer ve ORM (Object-Relational Mapping) yapısını kullanarak bu süreci kolaylaştırır.
Başlarken:
Öncelikle, projemize Room kütüphanesini eklememiz gerekiyor. build.gradle dosyanıza şu bağımlılıkları ekleyin:
dependencies {
val room_version = "2.6.1"
implementation("androidx.room:room-runtime:$room_version")
annotationProcessor("androidx.room:room-compiler:$room_version")
kapt("androidx.room:room-compiler:$room_version")
}kapt, Kotlin için annotation processing aracıdır. Room, veri tabanı işlemlerini gerçekleştirmek için kod üretirken annotation processing kullanır.
Entity Tanımlama
Room ile çalışırken ilk adım, veritabanı tablomuzu tanımlamaktır. Bunu bir Entity sınıfı ile yaparız. Gerçek hayattan bir örnek verelim: Bir kullanıcı tablosu oluşturalım.
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int,
val name: String,
val age: Int
)Burada User sınıfı, users adında bir veritabanı tablosunu temsil eder. Her User nesnesi bir tablo satırına karşılık gelir. @Entity notasyonu, bu sınıfın bir veritabanı tablosu olduğunu belirtir. @PrimaryKey notasyonu ise tablonun birincil anahtarını belirtir.
DAO (Data Access Object)
DAO, veritabanı işlemlerini gerçekleştirmek için kullanılan arayüzdür. CRUD (Create, Read, Update, Delete) işlemlerini tanımlarız. Kullanıcılarımızı veritabanına eklemek ve sorgulamak için bir UserDao arayüzü oluşturalım.
import androidx.room.*
@Dao
interface UserDao {
@Query("SELECT * FROM users")
suspend fun getAllUsers(): List<User>
@Insert
suspend fun insertUser(user: User)
@Update
suspend fun updateUser(user: User)
@Delete
suspend fun deleteUser(user: User)
}Bu arayüzde, tüm kullanıcıları almak için getAllUsers, yeni bir kullanıcı eklemek için insertUser, mevcut bir kullanıcıyı güncellemek için updateUser ve bir kullanıcıyı silmek için deleteUser metodlarını tanımladık.
Database Tanımlama
Son olarak, Room veritabanını tanımlamalıyız. Bunu bir @Database notasyonu ile yaparız. Veritabanının versiyonunu ve içerdiği entity sınıflarını belirtiriz.
import androidx.room.Database
import androidx.room.RoomDatabase
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}Bu sınıf, Room veritabanının ana sınıfıdır ve DAO’ları tanımlar.
Room Veritabanını Kullanma
Şimdi, Room veritabanını kullanarak CRUD işlemlerini gerçekleştirebiliriz. Öncelikle veritabanı örneğini oluşturmalıyız.
import android.content.Context
import androidx.room.Room
fun getDatabase(context: Context): AppDatabase {
return Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
).build()
}Bu fonksiyon, uygulama bağlamını alır ve AppDatabase örneğini oluşturur. Veritabanı adı app_database olarak belirlenmiştir.
Kullanıcı Ekleme ve Listeleme
Şimdi, kullanıcı ekleme ve listeleme işlemlerini gerçekleştirelim. Uygulamamızın kullanıcı ekleme ve listeleme ekranlarını ele alalım.
import kotlinx.coroutines.*
fun main() {
val context: Context = ... // Application context
val db = getDatabase(context)
val userDao = db.userDao()
// Kullanıcı ekleme
GlobalScope.launch {
val newUser = User(id = 0, name = "John Doe", age = 30)
userDao.insertUser(newUser)
println("Kullanıcı eklendi: $newUser")
}
// Kullanıcıları listeleme
GlobalScope.launch {
val users = userDao.getAllUsers()
users.forEach {
println("Kullanıcı: ${it.name}, Yaş: ${it.age}")
}
}
}Bu örnekte, GlobalScope kullanarak coroutine’ler içinde kullanıcı ekleme ve listeleme işlemlerini gerçekleştirdik. insertUser ve getAllUsers metodları suspend fonksiyonlar olduğu için coroutine içinde çalıştırılmalıdır.
Güncelleme ve Silme
Kullanıcı güncelleme ve silme işlemleri de benzer şekilde gerçekleştirilir.
// Kullanıcı güncelleme
GlobalScope.launch {
val user = userDao.getAllUsers().first()
val updatedUser = user.copy(name = "Jane Doe", age = 28)
userDao.updateUser(updatedUser)
println("Kullanıcı güncellendi: $updatedUser")
}
// Kullanıcı silme
GlobalScope.launch {
val user = userDao.getAllUsers().first()
userDao.deleteUser(user)
println("Kullanıcı silindi: $user")
}Burada, copy fonksiyonu ile mevcut kullanıcıyı güncelleyip updateUser metodunu çağırdık. deleteUser metodu ile de kullanıcıyı sildik.
Room kütüphanesi, Android geliştirmede yerel veritabanı işlemlerini kolaylaştıran güçlü bir araçtır. Entity, DAO ve Database sınıfları ile veritabanı işlemlerini sade ve etkili bir şekilde yönetebiliriz. Gerçek hayattan örneklerle, Room’un kullanımını ve avantajlarını anlamak daha kolay hale gelir.
Umarım bu anlatım, Room kütüphanesi hakkında daha iyi bir anlayış sağlar ve projelerinizde kullanmanız için size ilham verir. İyi kodlamalar!

Yazan
Serhat TaştanMobile & Web Developer & Trainer & CATH Lab Nurse
Mühendislik disiplinine sahip bir yazılım geliştirici ve Başakşehir Çam ve Sakura Şehir Hastanesi'nde (Anjiyo Ünitesi) görev yapan bir hemşireyim. Unvanlara takılmadan, klinik deneyimimi ve yazılım yeteneklerimi birleştirerek problem odaklı çözümler üretiyorum. Çok yönlülüğün gücüne inanarak, ister hastanede ister klavye başında süreçleri iyileştiriyor ve somut sonuçlar yaratıyorum.