Overview #

Tidak semua data perlu disimpan — dan tidak semua data yang perlu disimpan butuh database penuh. Memilih solusi local storage yang tepat adalah keputusan arsitektur yang akan mempengaruhi performa, kompleksitas kode, dan kemudahan pemeliharaan aplikasi. Artikel ini memberikan peta lengkap ekosistem local storage Flutter sebelum kita menyelami setiap solusi secara mendalam.

Kapan Butuh Local Storage? #

TIDAK perlu local storage jika:
  ✓ Data selalu fresh dari server dan tidak perlu offline
  ✓ Data kecil dan sementara -- cukup simpan di state (RAM)
  ✓ Aplikasi selalu butuh koneksi untuk berfungsi

PERLU local storage jika:
  ✓ Butuh offline support -- app tetap bisa digunakan tanpa internet
  ✓ Cache data dari server untuk tampilan yang lebih cepat
  ✓ Simpan preferensi pengguna (tema, bahasa, pengaturan)
  ✓ Data yang dibuat pengguna sebelum sync ke server
  ✓ Menghindari request berulang untuk data yang jarang berubah
  ✓ Token auth, session data, onboarding state

Peta Ekosistem Local Storage Flutter #

SIMPEL (key-value):
  SharedPreferences  -- preferensi, settings, flag boolean
  flutter_secure_storage -- token, data sensitif (sudah dibahas di Auth)

NOSQL (object store):
  Hive               -- cache ringan, data terstruktur sederhana
  ObjectBox          -- performa tinggi, relasi antar objek

SQL (relasional):
  Drift              -- type-safe SQL, query kompleks, migrasi terkelola
  sqflite            -- raw SQLite (Drift lebih direkomendasikan)

Perbandingan Fitur Lengkap #

SharedPrefsHiveObjectBoxDrift
Tipe dataPrimitif sajaSemua (dengan adapter)Semua (dengan anotasi)Semua (type-safe)
QueryTidak adaTerbatasQuery builderSQL penuh
RelasiTidak adaManualToOne / ToManyJOIN
Reactive streamTidakTerbatas✓ watchQuery✓ watch()
EnkripsiTidak✓ AES-256ManualManual
Code generationTidakOpsionalWajibWajib
Web support
Performa tulisLambatCepatTercepatSedang
Performa bacaLambatCepatTercepatSedang
Migrasi schemaN/AManualSemi-otomatis✓ Terkelola
Kurva belajarRendahRendahSedangTinggi
Cocok untukSettingsCacheObjek kompleksData relasional

Benchmark Performa (Perkiraan) #

Operasi 1.000 item:

Tulis:
  SharedPreferences : ~15.000 ms  (sangat lambat untuk batch)
  Hive              :    ~800 ms
  ObjectBox         :    ~200 ms  ← tercepat
  Drift             :    ~400 ms

Baca:
  SharedPreferences :  ~8.000 ms
  Hive              :    ~500 ms
  ObjectBox         :    ~150 ms  ← tercepat
  Drift             :    ~300 ms

SharedPreferences memang jauh lebih lambat — tapi ia bukan untuk operasi batch. Ia didesain untuk satu-dua key, bukan ribuan item.


Decision Tree — Pilih yang Tepat #

Apa yang ingin kamu simpan?
  │
  ├─ Pengaturan/preferensi sederhana (tema, bahasa, flag login)
  │    → SharedPreferences
  │
  ├─ Token auth atau data sensitif
  │    → flutter_secure_storage (sudah dibahas di section Networking)
  │
  ├─ Cache data dari API (list produk, artikel, dll.)
  │    │
  │    ├─ Data sederhana, tidak ada relasi antar objek
  │    │    → Hive
  │    │
  │    └─ Data dengan relasi (produk punya kategori, user punya pesanan)
  │         → ObjectBox atau Drift
  │
  ├─ Data yang dibuat pengguna (todo, catatan, transaksi)
  │    │
  │    ├─ Butuh relasi antar entitas dan query yang fleksibel
  │    │    → Drift
  │    │
  │    └─ Butuh performa tinggi atau sync otomatis
  │         → ObjectBox
  │
  └─ Butuh dukungan web (Flutter Web)
       ├─ SharedPreferences atau Hive (keduanya support web)
       └─ Drift (support web dengan WASM)
       → Hindari ObjectBox (tidak support web)

Bisa Menggunakan Lebih dari Satu? #

Ya — dan ini umum di aplikasi produksi:

// Kombinasi yang sering digunakan:

SharedPreferences    tema, bahasa, onboarding state, flag
Hive                 cache response API (produk, artikel)
ObjectBox            data offline yang dibuat pengguna
flutter_secure_storage  token auth

// Contoh di aplikasi e-commerce:
SharedPreferences: isDarkMode, selectedLanguage, hasSeenOnboarding
Hive:              cachedProdukList, cachedKategori
ObjectBox:         draftPesanan, produkFavorit, riwayatPencarian

Yang penting: jangan duplikasi data — setiap data disimpan di satu tempat saja.


Yang Sengaja Tidak Dibahas #

Isar — sempat populer, tapi ditinggalkan oleh pembuatnya dan kini dirawat oleh komunitas. Tidak direkomendasikan untuk proyek baru.

sqflite — package SQLite raw yang lebih rendah level. Drift dibangun di atasnya dan jauh lebih ergonomis. Gunakan Drift alih-alih sqflite langsung.

Realm — deprecation diumumkan September 2024 oleh MongoDB. Tidak direkomendasikan untuk proyek baru.


Ringkasan #

  • Local storage dibutuhkan untuk offline support, caching, preferensi pengguna, dan data yang dibuat pengguna sebelum sync ke server.
  • SharedPreferences untuk data key-value sederhana seperti settings dan flag — cepat diimplementasikan, tidak butuh setup kompleks.
  • Hive untuk cache data terstruktur yang tidak butuh relasi antar objek — cepat, ringan, mendukung web.
  • ObjectBox untuk data objek yang kompleks dengan relasi — performa tertinggi, relasi ToOne/ToMany built-in, tapi tidak support web.
  • Drift untuk data relasional yang kompleks — SQL penuh, migrasi schema terkelola, reactive stream, support semua platform termasuk web.
  • Boleh menggunakan lebih dari satu solusi dalam satu aplikasi — sesuaikan dengan kebutuhan setiap jenis data.
  • Hindari Isar (ditinggalkan maintainer), sqflite langsung (Drift lebih baik), dan Realm (deprecated 2024).

← Sebelumnya: Networking Best Practice   Berikutnya: SharedPreferences →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact