Veri depolama, bir mobil uygulamanın performansını, güvenliğini ve kullanıcı deneyimini etkileyen temel görevlerinden biridir. Bu makalede SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore ve Keychain'in yanı sıra serileştirme biçimlerini (JSON, Protobuf) ve kitaplıkları (Gson, Moshi, kotlinx.serialization) ele alacağız. Bu kılavuz, başlangıç seviyesindeki geliştiricilerin doğru veri depolama çözümünü seçmesine yardımcı olacaktır. Ayrıntılı bilgi için resmi Android veri depolama kılavuzuna bakın.
Önemli Noktalar
Varlıklar arasında ilişkiler bulunan yapılandırılmış verileri depolamak için ilişkisel veritabanları kullanılır.
SQLite, herhangi bir mobil platformda çalışan gömülü bir ilişkisel veritabanıdır. Ayrı bir sunucu gerektirmez, veriler tek bir dosyada saklanır. SQLite, Room (Android) ve isteğe bağlı olarak Core Data'nın (iOS) temelidir. Kitaplıklar: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room, SQLite ile çalışmak için resmi Android Architecture Components kitaplığıdır. Bir ORM katmanı sağlar: Entity (tablo), DAO (sorgular), Database (giriş noktası). Room, SQL sorgularını derleme zamanında kontrol eder, coroutine ve Flow'u destekler ve şemayı otomatik olarak taşır.
@Entity data class User( @PrimaryKey val id: Int, val name: String, val email: String ) @Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") suspend fun getUser(id: Int): User? }
Core Data, nesne grafiğini yönetmek için Apple'ın framework'üdür. Saf bir veritabanı değildir — SQLite, XML veya ikili depolama üzerinde bir kalıcılık katmanıdır. Core Data, nesneleri (NSManagedObject), ilişkileri, şema sürümlemeyi, geri al/tekrar al ve NSManagedObjectContext aracılığıyla çoklu iş parçacığını yönetir.
Realm, yüksek performanslı bir mobil veritabanı olarak tasarlanmış SQLite alternatifidir. Realm, okuma ve yazmada SQLite'dan daha hızlıdır, reaktif bildirimleri (Live Objects), anında şifrelemeyi ve çapraz platformu (Android, iOS, Flutter, React Native) destekler. Dezavantajları: artan APK/IPA boyutu ve daha yüksek bellek kullanımı.
Küçük miktarlardaki verileri (ayarlar, token'lar, önbellek) depolamak için basit anahtar-değer depoları kullanılır.
SharedPreferences, Android'de eski bir anahtar-değer deposudur. Eksileri: senkron erişim (okuma sırasında UI'ı bloke eder), tipleme eksikliği, büyük dosya yüklerken ANR riski. Yeni projeler için ÖNERİLMEZ.
DataStore, Google'ın SharedPreferences'a modern alternatifidir. Kotlin Coroutines ve Flow aracılığıyla asenkron çalışır, Preferences DataStore'u (anahtar-değer) ve Proto DataStore'u (Protobuf ile tipli veri) destekler. DataStore, UI iş parçacığı için güvenlidir ve işlemleri destekler.
UserDefaults, iOS'ta küçük ayarlar için standart depolama alanıdır. İlkel türleri, dizeleri, tarihleri, Data'yı destekler. UserDefaults senkron olduğundan büyük veri hacimleri için uygun değildir. register(defaults:) ile değer kaydı varsayılan değerleri belirler.
Cihazlar arasında senkronizasyon gerektiren uygulamalarda veri depolamak için Firebase bulut veritabanları kullanılır.
Firebase Firestore, gerçek zamanlı abonelikler, otomatik ölçekleme, güçlü sorgular ve yerleşik çevrimdışı mod ile bir NoSQL belge veritabanıdır. Veriler koleksiyonlar ve belgeler (JSON benzeri yapılar) halinde düzenlenir. Firestore, işlemleri ve toplu işlemleri destekler. Sohbetler, akışlar ve sosyal uygulamalar için idealdir.
Firebase Realtime Database, verileri tek bir JSON ağacı olarak depolayan daha eski bir Firebase NoSQL veritabanıdır. Firestore'dan daha basit ancak sorgulama ve ölçeklemede daha az esnektir. Basit gerçek zamanlı uygulamalar (çevrimiçi durum, basit sohbetler) için önerilir.
| Özellik | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Veri modeli | Koleksiyonlar → Belgeler | JSON ağacı |
| Sorgular | Karmaşık (filtreleme, sıralama, limitler) | Basit (anahtara göre) |
| Ölçekleme | Otomatik | Manuel parçalama |
| Çevrimdışı mod | Evet (kalıcı önbellek) | Evet |
| Fiyatlandırma | Okuma/yazma işlemi başına | Trafik + depolama başına |
Token'ların, şifrelerin ve şifreleme anahtarlarının depolanması özel korumalı depolar gerektirir.
Android Keystore, kriptografik anahtarlar için sistem deposudur. Anahtarlar, uygulamaların ve işletim sisteminin erişemeyeceği bir donanım ortamında (TEE — Trusted Execution Environment) saklanır. Anahtar oluşturma, şifreleme ve imzalamayı destekler. Android 9+ ile StrongBox Keymaster (özel çip) içerir.
Keychain Services, şifreler, anahtarlar ve sertifikalar için güvenli bir iOS deposudur. Veriler, donanım Secure Enclave kullanılarak şifrelenir. Keychain, erişilebilirlik seviyelerini destekler: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences, AES256-GCM ve HKDF aracılığıyla anahtar ve değer şifrelemesi ile SharedPreferences üzerinde bir sarmalayıcıdır. AndroidX Security kitaplığında uygulanmıştır. Token'ları ve hassas ayarları depolamak için önerilir.
IT Sectr'de yenileme token'larını ve biyometrik tabanlı anahtarları depolamak için Android Keystore + EncryptedSharedPreferences kullanıyoruz. iOS'ta maksimum güvenlik için kSecAttrAccessibleWhenUnlockedThisDeviceOnly seviyesinde Keychain kullanıyoruz.
Dosya depolama (resimler, videolar, belgeler) için mobil platformlar çeşitli depolama türleri sağlar.
Android, Internal Storage (/data/data/paket/ — özel depolama) ile External Storage (SD kart veya öykünmüş bölüm) arasında ayrım yapar. Cache Directory, sistemin temizleyebileceği geçici depolama alanıdır. Scoped Storage (Android 10+), External Storage'a erişimi kısıtlar — uygulamalar yalnızca kendi dosyalarını veya MediaStore/SAF aracılığıyla dosyaları görebilir.
iOS, Documents Directory (iCloud yedekleme, kalıcı veriler), Library/Caches (geçici dosyalar, yedeklenmez) ve Tmp Directory (geçici, temizlenebilir) sağlar. Dosya sistemiyle çalışmak için NSFileManager'ı kullanın. iOS 11+, bulut dosyaları için File Provider'ı destekler.
Serileştirme, nesneleri iletim veya depolama için bir biçime dönüştürür. Serileştirmeyi çözme ters işlemdir.
JSON (JavaScript Object Notation) en popüler biçimdir: okunabilir, esnek, tüm platformlar tarafından desteklenir. XML daha katıdır, eski sistemlerde kullanılır. Protobuf (Protocol Buffers), Google'dan ikili bir biçimdir: JSON'dan 3-10 kat daha kompakt, daha hızlı ayrıştırılır ve katı bir şemaya sahiptir. Yüksek yüklü sistemler ve mikro hizmetler için kullanılır.
JSONSerialization, JSON ile çalışmak için yerleşik API'dir. Codable (Encodable/Decodable), JSON, Property List ve diğer biçimlere otomatik serileştirme için modern bir Swift protokolüdür.
struct User: Codable { let id: Int let name: String let email: String } let user = User(id: 1, name: "Alice", email: "alice@example.com") let encoder = JSONEncoder() let jsonData = try encoder.encode(user)
Flutter ve React Native için kendi verimli depolama kitaplıkları bulunur.
Hive, Flutter için hafif ve hızlı bir anahtar-değer deposudur. Yerel kod gerektirmez (saf Dart), TypeAdapter aracılığıyla tiplemeyi destekler ve isolate'lerde çalışır. Önbellek, ayarlar ve küçük veri hacimleri için idealdir.
ObjectBox, Flutter, Android ve iOS için yüksek performanslı gömülü bir veritabanıdır. SQLite'dan 10+ kat daha hızlıdır, minimum ek yük için düz dosya yapısı kullanır. İlişkileri, sorguları ve reaktif abonelikleri (ObjectBox Dart) destekler.
Drift, Flutter ve Dart için reaktif bir SQLite kitaplığıdır. Tür güvenli sorgular, geçişler, DAO işlevleri ve Stream desteği (reaktif güncellemeler) sağlar. Drift, SQLite gerektiren Flutter projeleri için birincil tercihtir.
Sıkça Sorulan Sorular
Seçim platforma bağlıdır: Room (Android) derleme zamanı sorgu denetimi ile SQLite tabanlı resmi kitaplıktır. Core Data (iOS) nesne grafiği ile Apple'ın framework'üdür. Çapraz platform projeler için Realm veya ORM aracılığıyla SQLite uygundur.
SharedPreferences, senkron erişim ve ANR riski olan eski bir uygulamadır. DataStore (Jetpack), Kotlin Coroutines ve Flow tabanlı modern bir alternatiftir, asenkronluk, tipleme ve hata korumasını destekler.
Android: EncryptedSharedPreferences veya Android Keystore. iOS: WhenUnlockedThisDeviceOnly erişilebilirliği ile Keychain Services. Kritik veriler için biyometri ile Secure Enclave (iOS) ve donanım Keystore (Android) kullanın.
Cloud Firestore, gerçek zamanlı senkronizasyon, çevrimdışı mod ve otomatik ölçekleme ile Firebase'in NoSQL veritabanıdır. Sohbetler, haber akışları ve cihazlar arası senkronizasyon gerektiren projeler için uygundur.
Flutter: Hive (hızlı anahtar-değer), Floor (SQLite ORM), Drift (Moor, reaktif SQLite), ObjectBox (yüksek performanslı gömülü DB). React Native: Realm, WatermelonDB (tembel yükleme) ve AsyncStorage (SharedPreferences benzeri).
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.