Local Storage (AsyncStorage, MMKV) — Mobile

Persistent Storage di Mobile Mobile app butuh menyimpan data lokal — user preferences, cached data, auth tokens. Tidak ada localStorage seperti di browser, tapi

Persistent Storage di Mobile

Mobile app butuh menyimpan data lokal — user preferences, cached data, auth tokens. Tidak ada localStorage seperti di browser, tapi ada beberapa alternatif yang lebih powerful.

AsyncStorage — Simple Key-Value

import AsyncStorage from '@react-native-async-storage/async-storage';

// Simpan data
await AsyncStorage.setItem('user_name', 'Budi');
await AsyncStorage.setItem('settings', JSON.stringify({
  darkMode: true,
  language: 'id',
}));

// Baca data
const name = await AsyncStorage.getItem('user_name');
const settings = JSON.parse(await AsyncStorage.getItem('settings'));

// Hapus
await AsyncStorage.removeItem('user_name');

// Multi-operations (batch, lebih efisien)
await AsyncStorage.multiSet([
  ['key1', 'value1'],
  ['key2', 'value2'],
]);
const results = await AsyncStorage.multiGet(['key1', 'key2']);

MMKV — High Performance Storage

import { MMKV } from 'react-native-mmkv';

const storage = new MMKV();

// Synchronous! (beda dari AsyncStorage yang async)
storage.set('user.name', 'Budi');
storage.set('user.age', 25);
storage.set('user.premium', true);

const name = storage.getString('user.name');    // 'Budi'
const age = storage.getNumber('user.age');       // 25
const isPremium = storage.getBoolean('user.premium'); // true

// Delete
storage.delete('user.name');
storage.clearAll();

Expo SecureStore — Untuk Data Sensitif

import * as SecureStore from 'expo-secure-store';

// Auth token HARUS di SecureStore, bukan AsyncStorage
await SecureStore.setItemAsync('auth_token', 'eyJhbGci...');
const token = await SecureStore.getItemAsync('auth_token');
await SecureStore.deleteItemAsync('auth_token');

// SecureStore menggunakan:
// iOS: Keychain Services (encrypted)
// Android: SharedPreferences + Android Keystore

Perbandingan Storage Options

Zustand + MMKV Persistence

import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';
import { MMKV } from 'react-native-mmkv';

const storage = new MMKV();

const mmkvStorage = {
  getItem: (name) => storage.getString(name) ?? null,
  setItem: (name, value) => storage.set(name, value),
  removeItem: (name) => storage.delete(name),
};

const useSettingsStore = create(
  persist(
    (set) => ({
      theme: 'light',
      setTheme: (theme) => set({ theme }),
    }),
    {
      name: 'settings-storage',
      storage: createJSONStorage(() => mmkvStorage),
    }
  )
);

Yang akan kamu pelajari