Mobil uygulamalarda veri depolama, kullanıcı verilerini, uygulama ayarlarını ve geçici bilgileri cihazda saklamak için kullanılır. React Native'de farklı depolama yöntemleri mevcuttur ve her birinin kendine özgü kullanım alanları vardır.
Depolama Türleri:
AsyncStorage: Basit anahtar-değer depolama
SecureStore: Güvenli veri depolama
SQLite: İlişkisel veritabanı
Realm: Nesne veritabanı
MMKV: Yüksek performanslı depolama
AsyncStorage ile Temel Depolama
AsyncStorage, React Native'in en basit depolama çözümüdür. Anahtar-değer çiftleri şeklinde veri saklar ve asenkron olarak çalışır.
Karmaşık veri yapıları ve ilişkiler için SQLite kullanabilirsiniz. Bu, tam özellikli bir SQL veritabanıdır.
// SQLite kurulumu npx expo install expo-sqlite // SQLite kullanımı import * as SQLite from 'expo-sqlite'; // Veritabanı açma const db = SQLite.openDatabase('myapp.db'); // Tablo oluşturma const createTables = () => { db.transaction(tx => { // Kullanıcılar tablosu tx.executeSql( `CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP );` ); // Görevler tablosu tx.executeSql( `CREATE TABLE IF NOT EXISTS tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, title TEXT NOT NULL, description TEXT, completed BOOLEAN DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users (id) );` ); }); }; // Kullanıcı ekleme const addUser = (name, email) => { return new Promise((resolve, reject) => { db.transaction(tx => { tx.executeSql( 'INSERT INTO users (name, email) VALUES (?, ?)', [name, email], (_, result) => { resolve(result.insertId); }, (_, error) => { reject(error); } ); }); }); }; // Kullanıcıları listeleme const getUsers = () => { return new Promise((resolve, reject) => { db.transaction(tx => { tx.executeSql( 'SELECT * FROM users ORDER BY created_at DESC', [], (_, result) => { const users = []; for (let i = 0; i < result.rows.length; i++) { users.push(result.rows.item(i)); } resolve(users); }, (_, error) => { reject(error); } ); }); }); }; // Görev ekleme const addTask = (userId, title, description) => { return new Promise((resolve, reject) => { db.transaction(tx => { tx.executeSql( 'INSERT INTO tasks (user_id, title, description) VALUES (?, ?, ?)', [userId, title, description], (_, result) => { resolve(result.insertId); }, (_, error) => { reject(error); } ); }); }); }; // Kullanıcının görevlerini getirme const getUserTasks = (userId) => { return new Promise((resolve, reject) => { db.transaction(tx => { tx.executeSql( `SELECT t.*, u.name as user_name FROM tasks t JOIN users u ON t.user_id = u.id WHERE t.user_id = ? ORDER BY t.created_at DESC`, [userId], (_, result) => { const tasks = []; for (let i = 0; i < result.rows.length; i++) { tasks.push(result.rows.item(i)); } resolve(tasks); }, (_, error) => { reject(error); } ); }); }); }; // Görev tamamlama const completeTask = (taskId) => { return new Promise((resolve, reject) => { db.transaction(tx => { tx.executeSql( 'UPDATE tasks SET completed = 1 WHERE id = ?', [taskId], (_, result) => { resolve(result.rowsAffected > 0); }, (_, error) => { reject(error); } ); }); }); }; // Veritabanı sıfırlama const resetDatabase = () => { db.transaction(tx => { tx.executeSql('DROP TABLE IF EXISTS tasks'); tx.executeSql('DROP TABLE IF EXISTS users'); }); createTables(); }; // React bileşeninde kullanım const DatabaseExample = () => { const [users, setUsers] = useState([]); const [tasks, setTasks] = useState([]); useEffect(() => { createTables(); loadUsers(); }, []); const loadUsers = async () => { try { const userList = await getUsers(); setUsers(userList); } catch (error) { console.error('Kullanıcılar yüklenirken hata:', error); } }; const handleAddUser = async (name, email) => { try { await addUser(name, email); loadUsers(); Alert.alert('Başarılı', 'Kullanıcı eklendi'); } catch (error) { Alert.alert('Hata', 'Kullanıcı eklenemedi'); } }; // Component render... };
📊 Depolama Yöntemleri Karşılaştırması
Yöntem
Güvenlik
Performans
Kullanım Alanı
Veri Boyutu
AsyncStorage
Düşük
Orta
Basit ayarlar, tercihler
Küçük
SecureStore
Yüksek
Orta
Şifreler, token'lar
Küçük
SQLite
Orta
Yüksek
Karmaşık veri yapıları
Büyük
Realm
Orta
Çok Yüksek
Nesne veritabanı
Büyük
MMKV
Düşük
Çok Yüksek
Hızlı anahtar-değer
Orta
MMKV ile Yüksek Performanslı Depolama
MMKV, AsyncStorage'a göre çok daha hızlı olan bir anahtar-değer depolama çözümüdür:
// MMKV kurulumu npm install react-native-mmkv // iOS için ek kurulum cd ios && pod install // MMKV kullanımı import { MMKV } from 'react-native-mmkv'; // MMKV instance oluşturma const storage = new MMKV(); // Şifrelenmiş storage const encryptedStorage = new MMKV({ id: 'encrypted-storage', encryptionKey: 'your-encryption-key' }); // Veri kaydetme storage.set('user.name', 'John Doe'); storage.set('user.age', 30); storage.set('user.isActive', true); // Obje kaydetme const userObject = { name: 'John', email: 'john@example.com' }; storage.set('user.profile', JSON.stringify(userObject)); // Veri okuma const userName = storage.getString('user.name'); const userAge = storage.getNumber('user.age'); const isActive = storage.getBoolean('user.isActive'); // Obje okuma const userProfileString = storage.getString('user.profile'); const userProfile = userProfileString ? JSON.parse(userProfileString) : null; // Veri silme storage.delete('user.name'); // Tüm verileri silme storage.clearAll(); // Tüm anahtarları listeleme const allKeys = storage.getAllKeys(); // Veri varlığını kontrol etme const hasUserName = storage.contains('user.name'); // React Hook ile MMKV kullanımı import { useMMKVString, useMMKVNumber, useMMKVBoolean } from 'react-native-mmkv'; const UserComponent = () => { const [username, setUsername] = useMMKVString('user.name'); const [age, setAge] = useMMKVNumber('user.age'); const [notifications, setNotifications] = useMMKVBoolean('user.notifications'); return ( <View> <TextInput value={username} onChangeText={setUsername} placeholder="Kullanıcı adı" /> <Text>Yaş: {age}</Text> <Switch value={notifications} onValueChange={setNotifications} /> </View> ); }; // Performans karşılaştırması const performanceTest = () => { const iterations = 1000; // MMKV test const mmkvStart = Date.now(); for (let i = 0; i < iterations; i++) { storage.set(`test_${i}`, `value_${i}`); } const mmkvTime = Date.now() - mmkvStart; console.log(`MMKV: ${mmkvTime}ms for ${iterations} operations`); // AsyncStorage karşılaştırması için benzer test yapılabilir };
Sonraki Adımlar
Bu derste veri depolama yöntemlerini öğrendiniz. Bir sonraki derste cihaz özelliklerine erişim konusunu ele alacak ve kamera, konum, bildirimler gibi native özellikleri nasıl kullanacağınızı öğreneceksiniz.