Android Studio'da Room Bağlantısı ve Yerel Depolama Oluşturma

Kerem Aydın·7 Temmuz 2026·⏱2 dk

Kısa cevap: room-runtime, room-ktx ve kapt room-compiler bağımlılıklarını ekleyin; @Entity, @Dao ve @Database tanımlayın; DAO üzerine bir repository oluşturun; Flow/korutinler aracılığıyla ViewModel ile entegre edin. Aşağıda, adım adım uygulanabilir kompakt bir plan bulunmaktadır.

Room Nedir ve Ne Zaman Kullanılır?

Room, Android Jetpack'ten SQLite için bir sarmalayıcıdır: SQL'in statik doğrulaması, Kotlin nesnelerine dönüştürme, korutin/Flow desteği, migrasyonlar ve test imkanı sağlar. Room'u kalıcı depolama (notlar, API önbelleği, çevrimdışı veriler) ve karmaşık sorgular (filtreler, JOIN) için kullanın. Geçici, bellek içi önbellekler için ViewModel/State yeterlidir.

Room, SQL'i derleme zamanında kontrol eder — tablo/alana ilişkin hataları build sırasında görürsünüz.

Projenin Hızlı Kurulumu

  1. build.gradle (app modülü) dosyasında aşağıdaki bağımlılıkları ekleyin (Kotlin KTS örneği):
val roomVersion = "2.6.1"
implementation("androidx.room:room-runtime:$roomVersion")
kapt("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
  1. Eklentiler bölümünde kotlin-kapt eklentisini etkinleştirin.
  2. Sync Now yapın.

Yaygın hata — kotlin-kapt veya room-compiler'ı unutmak: anotasyonlar kod üretmez ve build başarısız olur.

Uygulama Adımları (Pratik)

  1. Entity — tablo:
@Entity(tableName = "notes")
data class NoteEntity(
  @PrimaryKey(autoGenerate = true) val id: Long = 0,
  val title: String,
  val content: String,
  val createdAt: Long,
  val updatedAt: Long? = null,
  val isPinned: Boolean = false
)
  1. DAO — veri erişimi (gözlem için Flow, işlemler için suspend):
@Dao
interface NoteDao {
  @Query("SELECT * FROM notes ORDER BY isPinned DESC, updatedAt DESC")
  fun getAllNotes(): Flow<List<NoteEntity>>

  @Insert(onConflict = OnConflictStrategy.REPLACE)
  suspend fun insertNote(note: NoteEntity): Long
  // update, delete, getById...
}
  1. Database — giriş noktası:
@Database(entities = [NoteEntity::class], version = 1, exportSchema = true)
abstract class AppDatabase : RoomDatabase() {
  abstract fun noteDao(): NoteDao
  companion object {
    fun getInstance(context: Context) = Room.databaseBuilder(
      context.applicationContext,
      AppDatabase::class.java,
      "app_database.db"
    ).build()
  }
}
  1. Migrasyonlar: şema değiştiğinde version değerini artırın ve Migration ekleyin; yalnızca prototipler için fallbackToDestructiveMigration() kullanın.

  2. Repository — erişim mantığını soyutlar:

class NoteRepository(private val dao: NoteDao) {
  fun observeNotes() = dao.getAllNotes()
  suspend fun createNote(...) = dao.insertNote(...)
}
  1. ViewModel: Flow'a viewModelScope içinde abone olun, StateFlow/LiveData'yı güncelleyin ve DAO işlemlerini korutinlerde çalıştırın.

Minimal şema ve basit migrasyonlarla başlayın. TypeConverter'ları yalnızca gerektiğinde ekleyin (listeler, LocalDateTime).

Entegrasyon, Hata Ayıklama ve Pratik İpuçları

  • Suspend metotlarını IO bağlamında çağırın (viewModelScope.launch(Dispatchers.IO)) veya room-ktx kullanın (suspend için Room otomatik olarak thread değiştirir).
  • Hata ayıklama için Android Studio'daki Database Inspector'ı (App Inspection) kullanın.
  • Dosya depolama konumu: data/data//databases/app_database.db — uygulama için özeldir.

Migrasyonlar olmadan ve fallbackToDestructiveMigration() kullanmadan version değerini artırırsanız, uygulama güncelleme sırasında çöker.

Yaygın Hatalar

  • kotlin-kapt veya room-compiler unutulursa → build başarısız olur.
  • Ağır sorguların ana thread üzerinde çalıştırılması → ANR.
  • Migrasyonların ihmal edilmesi → güncelleme sırasında veri kaybı veya çökme.
  • Gereksiz SELECT * kullanımı — yalnızca gerekli alanları aktarın (projeksiyonlar/DTO).

SSS

  • Her zaman repository yazmak gerekir mi? Önerilir: veri kaynaklarını değiştirmeyi ve test etmeyi kolaylaştırır.
  • Tarihler nasıl saklanır? Genellikle Long (zaman damgası) veya ISO dizesi + LocalDateTime için TypeConverter.
  • Room Jetpack Compose ile kullanılabilir mi? Evet — StateFlow/LiveData'ya abone olun ve UI'yi reaktif olarak güncelleyin.

Gerekirse, @Relation, birden fazla tablo ve sürümler arası migrasyon örneği içeren bir örnek gönderebilirim.