Android Studio'da Room Bağlantısı ve Yerel Depolama Oluşturma
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
- 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")
- Eklentiler bölümünde kotlin-kapt eklentisini etkinleştirin.
- 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)
- 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
)
- 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...
}
- 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()
}
}
-
Migrasyonlar: şema değiştiğinde version değerini artırın ve Migration ekleyin; yalnızca prototipler için fallbackToDestructiveMigration() kullanın.
-
Repository — erişim mantığını soyutlar:
class NoteRepository(private val dao: NoteDao) {
fun observeNotes() = dao.getAllNotes()
suspend fun createNote(...) = dao.insertNote(...)
}
- 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.