Android'de yeni başlayanlar hangi veritabanını seçmeli: Kısa cevap ve eylem planı
Room'u seçin — uygulamaların %90'ı için daha basit, daha güvenli ve geliştirmesi daha hızlıdır; SQLite'ı yalnızca eğitim amaçlı denemeler veya çok hafif prototipler için saklayın. Aşağıda karşılaştırma, gerçek avantajlar/dezavantajlar ve Room ile 30–60 dakika içinde CRUD işlemlerini başlatmak için adım adım bir plan bulacaksınız.
Yerel bir veritabanına neden ihtiyaç vardır ve ne zaman SQLite/Room seçilmelidir
Verilerin uygulamalar kapatılıp açıldığında korunması gerekiyorsa yerel bir veritabanına ihtiyaç duyulur: notlar, ayarlar, önbellek, profiller. SQLite, sunucusuz yerleşik bir ilişkisel VTYS'dir; Room ise SQLite üzerinde çalışan modern bir Jetpack ORM katmanıdır; boilerplate kodu ortadan kaldırır ve type-safety (tür güvenliği) ile LiveData/Flow/Coroutines entegrasyonu sağlar.
Room, birçok SQL hatasını derleme zamanında yakalar ve LiveData/Flow aracılığıyla kullanıcı arayüzünü otomatik olarak günceller — hızlı ve kararlı prototipler için idealdir.
Kısa karşılaştırma (yeni başlayanlar için önemli olanlar)
| Kriter | SQLite (manuel) | Room (Jetpack) |
|---|---|---|
| Zorluk | orta: SQLiteOpenHelper ve SQL | düşük: anotasyonlar ve oluşturulan kod |
| Type-safety | yok | evet (derleme zamanında hatalar) |
| Eşzamanlılık | manuel | yerleşik (suspend, Flow, LiveData) |
| APK boyutu | ek 0 | +2–5 MB |
| Öneri | bir saatte hızlı prototip | herhangi bir gerçek uygulama, ölçeklendirmesi daha kolay |
Room ile hızlı başlangıç — adım adım (Kotlin)
- Proje oluşturun: New Project → Empty Activity, Kotlin, minSdk 24+.
- Bağımlılıkları ekleyin (module build.gradle.kts):
val room_version = "2.6.1"
implementation("androidx.room:room-runtime:$room_version")
implementation("androidx.room:room-ktx:$room_version")
kapt("androidx.room:room-compiler:$room_version")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.3")
- Entity:
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val name: String,
val age: Int
)
- Dao:
@Dao
interface UserDao {
@Query("SELECT * FROM users") fun getAll(): LiveData<List<User>>
@Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insert(user: User)
@Delete suspend fun delete(user: User)
}
- Database:
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
- ViewModel ve kullanım:
class UserViewModel(app: Application): AndroidViewModel(app) {
private val db = Room.databaseBuilder(app, AppDatabase::class.java, "db").build()
val users: LiveData<List<User>> = db.userDao().getAll()
suspend fun add(user: User) = db.userDao().insert(user)
}
Activity/Fragment içinde — users'ı observe edin ve insert işlemini coroutine içinde başlatın (viewModelScope.launch).
Room sorgularını UI thread'inde çalıştıramazsınız: suspend, Flow veya LiveData ve coroutines/Dispatchers.IO kullanın.
Yeni başlayanların sık yaptığı hatalar
- Şema değişikliğinde unutulmuş migrasyonlar → güncelleme sırasında çökme: Migration ekleyin veya yalnızca erken prototiplerde fallbackToDestructiveMigration kullanın.
- Main thread'i bloklama: SELECT bile eşzamanlı olarak yapılmalıdır.
- Sık filtrelenen alanlarda indeks eksikliği → yavaş sorgular.
- Entity içinde yanlış türler → NULL/veri kaybı. Non-nullable türleri ve dönüştürücüler (TypeConverters) kullanın.
SSS
- SQL öğrenmek gerekir mi? Evet — temel SQL, karmaşık sorgularda yardımcı olur ancak çoğu CRUD işlemi için Room ile @Query ve DAO yeterlidir.
- Mevcut bir .db dosyası bağlanabilir mi? Evet — Room, önceden paketlenmiş veritabanlarını (createFromAsset/createFromFile) ve migrasyonları destekler.
- SQLite ne zaman tercih edilmelidir? Jetpack bağımlılığı olmayan minimal görevler için veya veritabanı çekirdeğini öğrenirken.
Sonuç: Room ile başlayın — hızlıca çalışan, güvenli ve ölçeklenebilir kod elde edin. Düşük seviyeli mekanizmaları anlamak için SQLite ile oynayın, ancak gerçek uygulamalar için Room'u seçin. Geliştirme sürecinizde başarılar!