Hive — penyimpanan NoSQL ringan untuk Flutter yang bekerja tanpa kode asli. Tidak seperti SQLite atau Firebase, Hive tidak memerlukan pustaka asli dan bekerja secara eksklusif melalui Dart. Menurut Pub.dev, 2024, Hive telah diunduh lebih dari 10 juta kali dan digunakan di setiap proyek Flutter ketiga yang memerlukan penyimpanan data lokal tanpa infrastruktur server.
Poin utama
Hive — adalah basis data NoSQL yang ditulis sepenuhnya dalam Dart dan tidak memerlukan pustaka asli. Ini dibuat oleh Simon Leiter pada tahun 2019 sebagai alternatif untuk SQLite untuk proyek Flutter. Hive menyimpan data dalam format biner .hive, yang dioptimalkan untuk pembacaan dan penulisan cepat pada perangkat seluler. Format .hive menggunakan skema serialisasi kustom di mana setiap tipe data memiliki prefiks byte sendiri, memungkinkan pembacaan file tanpa pengetahuan awal tentang skema — tidak seperti Protocol Buffers atau FlatBuffers.
Ide utama Hive — kesederhanaan maksimal. Basis data tidak memerlukan inisialisasi mesin asli, tidak menyertakan parser SQL, dan tidak menggunakan refleksi. Semua operasi adalah panggilan langsung fungsi Dart dengan serialisasi biner melalui WriteBuffer dan ReadBuffer.
Menurut survei Flutter Community (2023), Hive berada di 5 besar paket paling banyak digunakan untuk penyimpanan data di Flutter, hanya kalah dari shared_preferences dalam popularitas, tetapi melampauinya dalam fungsionalitas dan kecepatan.
Hive menggunakan konsep Box — analog dari tabel dalam basis data relasional. Setiap Box adalah file di disk dengan sepasang kunci-nilai. Kunci dapat berupa int atau String, nilai — tipe primitif apa pun, daftar, Map, atau objek kustom melalui TypeAdapter. Box-box terisolasi satu sama lain dan dibuka secara independen.
Hive tidak memerlukan saluran platform (platform channels). Ini berarti ia bekerja sama di Android, iOS, Web, macOS, Windows, dan Linux tanpa konfigurasi tambahan. Untuk proyek yang menargetkan kompilasi web, Hive tetap menjadi satu-satunya solusi NoSQL ringan — SQLite tidak berfungsi di browser. Pada saat yang sama, Hive menggunakan IndexedDB sebagai backend untuk web, memastikan persistensi data juga di lingkungan browser.
Hive men-serialize data ke format biner saat menulis dan men-deserialize saat membaca. Mekanisme internal didasarkan pada BinaryWriter dan BinaryReader, yang mengemas data ke dalam array byte yang ringkas. Ukuran penyimpanan di disk rata-rata 2–3 kali lebih kecil daripada representasi JSON dari data yang sama.
Saat membuka Box, Hive memuat seluruh file ke dalam RAM. Ini memberikan kecepatan baca yang tinggi (mikrodetik), tetapi membatasi ukuran data: disarankan untuk menyimpan tidak lebih dari 50–100 MB per Box. Untuk volume yang lebih besar, gunakan LazyBox — pemuatan malas rekaman dari disk.
Hive bekerja single-threaded dalam isolasi Dart-isolate. Operasi tulis dilakukan secara sinkron dengan penguncian file. Untuk akses asinkron, gunakan Hive.openBox() dengan await. Akses bersamaan dari beberapa isolate tidak didukung secara langsung — untuk ini diperlukan mekanisme sinkronisasi terpisah.
Hive menempati ceruk antara SharedPreferences dan SQLite. Ia lebih kompleks daripada SharedPreferences (mendukung objek kustom), tetapi lebih sederhana daripada SQLite (tidak memerlukan kueri SQL). Mari bandingkan karakteristik utamanya.
| Karakteristik | Hive | SharedPreferences | SQLite |
|---|---|---|---|
| Tipe data | Semua (melalui TypeAdapter) | Hanya primitif | Tipe SQL |
| Kecepatan baca | ~30.000 ops/s | ~5.000 ops/s | ~2.000 ops/s |
| Kode asli | Tidak diperlukan | Diperlukan (Android) | Diperlukan |
| Dukungan web | Ya | Tidak | Tidak |
| Kompleksitas | Rendah | Minimal | Sedang |
| Reaktivitas | WatchBox | Tidak | Melalui ORM |
Hive optimal untuk volume data kecil: pengaturan aplikasi, cache respons API, antrean sinkronisasi lokal, favorit, dan riwayat penjelajahan. Jika data tidak melebihi 50 MB dan tidak memerlukan kueri relasional — Hive lebih cepat dan lebih sederhana daripada SQLite.
Hive tidak mendukung kueri dengan pemfilteran di beberapa bidang, JOIN, fungsi agregat. Jika Anda memerlukan kueri kompleks seperti “pilih semua tugas hari ini dengan prioritas di atas 3” — gunakan SQLite dengan drift atau floor. Hive juga tidak cocok untuk menyimpan lebih dari 100 MB data karena pemuatan ke memori.
Hive dimulai dengan inisialisasi dan pembukaan Box. Di bawah ini adalah operasi dasar untuk skenario tipikal — menyimpan daftar tugas dalam aplikasi Flutter. Semua contoh berfungsi tanpa panggilan platform asli.
Sebelum menggunakan Hive, Hive.initFlutter() harus dipanggil di fungsi main. Kemudian buka Box melalui Hive.openBox() — hasilnya adalah instance Box yang siap untuk dibaca dan ditulis.
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
void async main() {
await Hive.initFlutter();
final settingsBox = await Hive.openBox('settings');
runApp(MyApp());
}
Box menyediakan metode put, get, delete dan berisi iterator untuk menelusuri semua rekaman. Kunci dan nilai diketik melalui generik — secara default Box<dynamic> mengizinkan tipe apa pun, tetapi disarankan untuk menentukan tipe yang spesifik.
// Menulis data
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', 'Beli produk');
// Membaca
final task = box.get('task_1');
// Semua kunci
final allTasks = box.values.toList();
// Menghapus
await box.delete('task_1');
// Membersihkan Box
await box.clear();
WatchBox — ekstensi Box yang memberi tahu pelanggan tentang perubahan. Di Flutter, ini terintegrasi dengan ValueListenableBuilder: ketika nilai apa pun di Box berubah, widget dibangun ulang secara otomatis tanpa memanggil setState.
final watchBox = await Hive.openBox('settings');
// Di widget
ValueListenableBuilder(
valueListenable: watchBox.listenable(),
builder: (context, box, _) {
final counter = box.get('counter') ?? 0;
return Text('Penghitung: $counter');
},
)
TypeAdapter — mekanisme Hive untuk serialisasi objek Dart kustom. Adaptor menjelaskan cara mengonversi objek ke format biner (write) dan kembali (read). Tidak seperti json_serializable, TypeAdapter tidak memerlukan refleksi dan bekerja lebih cepat.
Adaptor mengimplementasikan antarmuka TypeAdapter
// Model data
class Task {
final String title;
final bool isCompleted;
Task({required this.title, this.isCompleted = false});
}
// TypeAdapter
class TaskAdapter extends TypeAdapter<Task> {
@override
final int typeId = 0;
@override
Task read(BinaryReader reader) {
return Task(
title: reader.readString(),
isCompleted: reader.readBool(),
);
}
@override
void write(BinaryWriter writer, Task obj) {
writer.writeString(obj.title);
writer.writeBool(obj.isCompleted);
}
}
Untuk proyek dengan banyak model, Hive menyediakan hive_generator dan build_runner. Anotasi @HiveType pada kelas dan @HiveField pada bidang menghasilkan adaptor secara otomatis. Ini berguna ketika model berisi 10+ bidang — menulis read/write secara manual menjadi memakan waktu.
Hive melakukan pembacaan dari memori, bukan dari disk, yang memberikan kecepatan hingga 30.000 operasi per detik. Untuk optimasi: buka Box sekali dan gunakan kembali di seluruh aplikasi, jangan panggil openBox lagi. Gunakan Hive.box() (getter sinkron) setelah inisialisasi — mengembalikan Box yang sudah dibuka tanpa membuat instance baru.
Hive mudah diintegrasikan dengan manajer state Flutter yang populer. Untuk Provider, gunakan ChangeNotifierProvider yang membaca data dari Box saat inisialisasi dan diperbarui melalui listenable. Untuk Riverpod, StreamProvider yang berlangganan WatchBox cocok. Kombinasi semacam itu memberikan pembaruan UI reaktif pada setiap perubahan data di Hive tanpa panggilan setState manual. Dalam proyek Flutter tipikal, arsitektur semacam itu memungkinkan sinkronisasi status antar layar tanpa singleton global.
Pertanyaan yang sering diajukan
Hive bekerja dalam Dart murni, sehingga dapat digunakan di proyek Dart mana pun: server (Dart VM), konsol, atau AngularDart. Untuk Flutter, hive_flutter dengan inisialisasi jalur penyimpanan terhubung secara terpisah.
Hive mendukung enkripsi AES-256 melalui parameter encryptionKey saat membuka Box. Kunci harus berupa string 32 byte. Box yang dienkripsi tidak dapat dibaca tanpa kunci — data dilindungi di tingkat file.
Isar — penerus Hive dari penulis yang sama (Simon Leiter). Isar lebih cepat, mendukung indeks, relasi, dan kueri kompleks. Namun, Hive tetap relevan untuk skenario sederhana di mana kemampuan relasional Isar tidak diperlukan dan untuk proyek di mana ketergantungan minimal penting.
Hive tidak memiliki migrasi bawaan. Jika struktur TypeAdapter berubah, data lama tidak akan ter-deserialisasi. Solusi: tingkatkan typeId adaptor dan tulis migrasi manual dalam kode, atau gunakan delete untuk kunci lama sebelum menulis yang baru.
Hive memuat Box sepenuhnya ke dalam memori. Batas yang disarankan adalah 50–100 MB per Box. Jika melebihi, mungkin terjadi penundaan saat membuka Box dan peningkatan konsumsi RAM. Untuk volume yang lebih besar, gunakan beberapa Box atau LazyBox dengan pemuatan malas.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga