Mobil uygulama geliştirirken kullanıcı deneyimini kesintisiz kılmak için offline veri depolama kritik bir rol oynar. React Native'de en yaygın kullanılan üç çözüm AsyncStorage, SQLite ve Realm'dir. Peki, hangisi sizin projenize en uygun? Bu yazıda her birini teknik özellikleri, performansı ve kullanım senaryoları açısından derinlemesine inceliyoruz.
AsyncStorage: Basit Anahtar-Değer Deposu Ne Zaman Yeterli?
React Native'in built-in modülü olan AsyncStorage, basit anahtar-değer (key-value) formatında veri saklar. Asenkron çalışır ve küçük ölçekli veriler (kullanıcı tercihleri, token, küçük config'ler) için idealdir. Ancak büyük veri kümeleri veya karmaşık sorgular için uygun değildir.
- Boyut limiti: iOS'ta 6 MB, Android'de sınır belirtilmemiş ancak büyük verilerde performans düşer.
- Veri tipi: Sadece string depolayabilir; obje veya dizi saklamak için JSON.stringify/parse gerekir.
- Sorgulama: Verileri sadece key ile alabilirsiniz, filtreleme veya sıralama yoktur.
Kullanım örneği: Kullanıcı ayarlarını kaydetmek için ideal. Örneğin tema seçimi, bildirim tercihleri gibi basit veriler.
import AsyncStorage from '@react-native-async-storage/async-storage';
const saveTheme = async (theme) => {
await AsyncStorage.setItem('theme', theme);
};
const getTheme = async () => {
return await AsyncStorage.getItem('theme');
};
SQLite: İlişkisel Veritabanı Gücü
SQLite, cihaz üzerinde tam teşekküllü bir SQL veritabanı sunar. Büyük veri setleri, karmaşık sorgular, çok tablolu yapılar ve indeksleme gerektiren projeler için en doğru seçimdir. React Native'de react-native-sqlite-storage veya expo-sqlite kütüphaneleri ile kullanılır.
- SQL Desteği: SELECT, JOIN, GROUP BY gibi tüm SQL komutları.
- Performans: İndeksleme ile büyük verilerde bile hızlı sorgulama.
- Veri bütünlüğü: ACID uyumlu, transaction desteği.
Kullanım örneği: Bir ürün kataloğu uygulaması, offline blog okuyucu, yapılacaklar listesi (çok sayıda kayıt ve kategori).
import SQLite from 'react-native-sqlite-storage';
const db = SQLite.openDatabase({name: 'my.db', location: 'default'}, () => {}, (err) => console.error(err));
db.transaction((tx) => {
tx.executeSql(
'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)',
[],
() => { console.log('Table created'); },
(error) => { console.error(error); }
);
});
Realm: Hızlı ve Nesne Yönelimli Alternatif
Realm, MongoDB tarafından geliştirilen, mobil öncelikli bir veritabanıdır. Nesne yönelimli bir yapı sunar, SQL'e ihtiyaç duymaz. Verileri doğrudan native obje olarak kullanır, bu da performansı artırır.
- Performans: AsyncStorage ve SQLite'den genellikle daha hızlıdır, özellikle yazma işlemlerinde.
- Kullanım kolaylığı: Model sınıfları tanımlayarak çalışır, SQL yazmaya gerek yoktur.
- Reactive: Veritabanındaki değişikliklere abone olup UI'ı otomatik güncelleme (Live Objects).
- Boyut: Kütüphane boyutu diğerlerine göre daha büyüktür (~10 MB).
Kullanım örneği: Gerçek zamanlı sohbet uygulamaları, sık veri güncellemeleri olan uygulamalar (örneğin takipçi sayacı).
import Realm from 'realm';
const CarSchema = {
name: 'Car',
properties: {
make: 'string',
model: 'string',
year: 'int',
}
};
const realm = new Realm({schema: [CarSchema]});
realm.write(() => {
realm.create('Car', {make: 'Toyota', model: 'Corolla', year: 2020});
});
const cars = realm.objects('Car').filtered('year > 2015');
Performans ve Ölçeklenebilirlik Karşılaştırması
| Özellik | AsyncStorage | SQLite | Realm |
|---|---|---|---|
| Veri Modeli | Key-Value (string) | İlişkisel (SQL tabloları) | Nesne yönelimli |
| Performans (yazma) | Orta | Yüksek | Çok yüksek |
| Performans (okuma) | Orta (tüm veriyi okuyup filtrelemek gerekir) | Yüksek (indeksli) | Çok yüksek |
| Depolama Sınırı | ~6 MB (iOS) | Uygulama bellek sınırına kadar | Uygulama bellek sınırına kadar |
| Kütüphane Boyutu | Küçük (~150 KB) | Orta (~1-2 MB) | Büyük (~10 MB) |
| SQL/Query Desteği | Yok | Tam SQL | Nesne sorgulama (Realm Query Language) |
| Reactive/Gözlem | Yok (elle kontrol) | Yok (query tekrarı) | Var (Live Objects) |
| Cross-platform | Evet | Evet | Evet |
Hangi Senaryoda Hangi Çözüm Seçilmeli?
- AsyncStorage şunlar için idealdir: küçük, basit ayarlar, token, tema tercihi gibi tek anahtarlı veriler. Uygulamanızda karmaşık sorgular veya büyük veri yoksa en hafif çözümdür.
- SQLite şu durumlarda tercih edilmelidir: büyük veri kümeleri, ilişkisel veri, sık sık sorgulama ve raporlama ihtiyacı. Örneğin bir e-ticaret uygulamasının offline ürün listesi.
- Realm özellikle gerçek zamanlı işlemler, sıkı nesne yönelimli yapı, reaktif UI ve yüksek yazma performansı gereken projelerde (sohbet, sosyal medya akışı) öne çıkar.
Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler
- Ana thread'de veritabanı işlemi yapmak: AsyncStorage ve diğer depolama işlemleri asenkron olmalıdır; aksi halde UI donar. Her zaman
awaitveya.then()kullanın. - AsyncStorage'da büyük JSON parse etmek: Tüm veriyi okuyup filtrelemek performansı düşürür. Büyük veriler için SQLite veya Realm daha uygundur.
- Realm'de schema migration'ı ihmal etmek: Veritabanı şeması değiştiğinde migration işlemi yapılmazsa uygulama çöker. Realm'de
schemaVersionve migration bloğu eklemeyi unutmayın. - Platform farklılıklarını test etmemek: iOS ve Android'de bazı depolama limitleri farklıdır (AsyncStorage'da olduğu gibi). Test ortamınızda her iki platformda da deneyin.
Performans İpuçları ve En İyi Uygulamalar
Offline depolama performansını optimize etmek için bazı pratik adımlar:
- Verileri mümkün olduğunca paralel değil, sıralı yazın; aynı anda çok sayıda yazma işlemi kilitlenmelere yol açabilir.
- SQLite'da mutlaka indeks kullanın. Özellikle sık sorgulanan alanlara (örneğin
WHERE name = ?) indeks ekleyin. - Realm'da
writeişlemlerini küçük parçalara bölün; büyük transaction'lar ana thread'i bloke edebilir. - Uygulamanızda offline senaryoları planlarken, önce internet bağlantısını kontrol edin, yoksa önbellekten veriyi getirin. Bunun için
@react-native-community/netinfokullanabilirsiniz.
Bu teknikleri uygulayarak, React Native uygulamanızda deep linking gibi diğer özellikleri de performanslı bir şekilde entegre edebilirsiniz. Ayrıca Flutter vs React Native karşılaştırmamızda da bu çözümlerin her iki framework'te nasıl uygulandığını görebilirsiniz. Eğer daha karmaşık bir veri boru hattına ihtiyacınız varsa, Web Workers ile arka plan işlemleri veya React'te debounce ve throttle tekniklerini de incelediğinizde performans kazanımı elde edebilirsiniz.
Sonuç Yerine: Doğru Seçim Uygulamanıza Bağlı
Her üç çözüm de React Native ekosisteminde olgun ve güvenlidir. AsyncStorage basit işler için, SQLite büyük ve karmaşık veriler için, Realm ise hızlı ve reaktif ihtiyaçlar için en doğru seçenektir. Projenizin gereksinimlerini netleştirdikten sonra yukarıdaki karşılaştırmalar ışığında seçiminizi yapabilirsiniz. Unutmayın, offline depolama sadece bir parçadır; veri senkronizasyonu, çakışma çözümü gibi konuları da planlamalısınız.
Sık Sorulan Sorular
React Native'de AsyncStorage yerine neden SQLite kullanmalıyım?
AsyncStorage basit anahtar-değer depolama için uygundur ancak büyük veri kümeleri, karmaşık sorgular ve ilişkisel veri gerektiğinde yetersiz kalır. SQLite, SQL desteği sayesinde esnek sorgulama, indeksleme ve veri bütünlüğü sağlar.
Realm kütüphanesi AsyncStorage'a göre ne kadar hızlı?
Realm, özellikle yazma işlemlerinde AsyncStorage'dan belirgin şekilde hızlıdır. Nesneleri doğrudan native bellekte tuttuğu için serileştirme/deserileştirme maliyeti yoktur. Okuma işlemlerinde de SQLite ile yarışır, ancak karmaşık sorgularda SQLite geride kalabilir.
React Native'de offline veri depolarken veri kaybını nasıl önlerim?
Transaction kullanarak atomik yazma işlemleri yapın (SQLite ve Realm destekler). Düzenli yedekleme ve senkronizasyon stratejisi belirleyin. Ayrıca AsyncStorage'da büyük veri için catch bloklarıyla hata yönetimi ekleyin.
Realm'in kütüphane boyutu büyük, yine de kullanmalı mıyım?
Eğer uygulamanızda gerçek zamanlı veri senkronizasyonu, reaktif UI ve yüksek performans kritikse Realm'in sağladığı avantajlar boyut dezavantajını gölgede bırakabilir. Aksi halde SQLite daha hafif bir alternatiftir.
Offline depolama için React Native'de başka alternatifler var mı?
Evet, MMKV (WeChat tarafından) ve WatermelonDB gibi alternatifler de popülerdir. MMKV, AsyncStorage'dan çok daha hızlıdır; WatermelonDB ise SQLite üzerine kurulu reaktif bir katmandır.






