Hive: ano ito, NoSQL imbakan at pag-develop nang walang native code

May-akda: IT Sectr Nai-publish: 2026-03-13 Oras ng pagbabasa: 9 min

Hive — magaan na NoSQL imbakan para sa Flutter na gumagana nang walang native code. Hindi tulad ng SQLite o Firebase, ang Hive ay hindi nangangailangan ng pagkonekta ng mga native na library at gumagana lamang sa pamamagitan ng Dart. Ayon sa Pub.dev, 2024, ang Hive ay na-download ng higit sa 10 milyong beses at ginagamit sa bawat ikatlong Flutter project na nangangailangan ng lokal na imbakan ng data nang walang server infrastructure.

Mga pangunahing punto

  • Hive — NoSQL database sa purong Dart, walang native code at platform dependencies
  • Performance — hanggang 30 000 pagbasa bawat segundo sa mobile device
  • Typing — TypeAdapter para sa custom na object, walang code generation
  • Magaan — 0 dependencies sa Android SDK o iOS UIKit
  • Reactive — WatchBox para sa real-time na pagsubaybay ng mga pagbabago

Ano ang Hive?

Hive — ay isang NoSQL database na ganap na nakasulat sa Dart at hindi nangangailangan ng native na library. Ito ay nilikha ni Simon Leiter noong 2019 bilang alternatibo sa SQLite para sa Flutter projects. Ang Hive ay nag-iimbak ng data sa binary format .hive, na na-optimize para sa mabilis na pagbasa at pagsulat sa mga mobile device. Ang .hive format ay gumagamit ng custom na serialization scheme kung saan ang bawat uri ng data ay may sariling byte prefix, na nagpapahintulot sa pagbasa ng file nang walang paunang kaalaman sa scheme — hindi tulad ng Protocol Buffers o FlatBuffers.

Ang pangunahing ideya ng Hive — maximum na pagiging simple. Ang database ay hindi nangangailangan ng initialization ng native engines, hindi naglalaman ng SQL parser at hindi gumagamit ng reflection. Lahat ng operasyon ay direktang tawag sa Dart functions na may binary serialization sa pamamagitan ng WriteBuffer at ReadBuffer.

Ayon sa survey ng Flutter Community (2023), ang Hive ay nasa top 5 ng pinakaginagamit na packages para sa pag-iimbak ng data sa Flutter, pangalawa lamang sa shared_preferences sa kasikatan, ngunit nahihigitan ito sa functionality at bilis.

Arkitektura ng Hive

Hive ay gumagamit ng konsepto ng Box — analogo ng table sa relational databases. Ang bawat Box ay isang file sa disk na may set ng key-value pairs. Ang key ay maaaring int o String, ang value — anumang primitive type, listahan, Map o custom na object sa pamamagitan ng TypeAdapter. Ang mga Box ay hiwalay sa isa't isa at binubuksan nang independyente.

Mga bentahe kumpara sa native na solusyon

Hive ay hindi nangangailangan ng platform channels. Ibig sabihin nito ay pareho itong gumagana sa Android, iOS, Web, macOS, Windows at Linux nang walang karagdagang configuration. Para sa mga project na naka-target sa web compilation, ang Hive ay nananatiling tanging magaan na NoSQL solution — ang SQLite ay hindi gumagana sa browser. Kasabay nito, ang Hive ay gumagamit ng IndexedDB bilang backend para sa web, na tinitiyak ang data persistence kahit sa browser environment.

Paano gumagana ang Hive?

Hive ay nagse-serialize ng data sa binary format kapag nagsusulat at nagde-deserialize kapag nagbabasa. Ang internal mechanism ay nakabatay sa BinaryWriter at BinaryReader, na nagpa-pack ng data sa mga compact byte arrays. Ang laki ng imbakan sa disk ay average na 2–3 beses na mas maliit kaysa sa JSON representation ng parehong data.

Kapag binubuksan ang Box, nilo-load ng Hive ang buong file sa RAM. Ito ay nagbibigay ng mataas na bilis ng pagbasa (microseconds), ngunit nagpapataw ng limitasyon sa laki ng data: inirerekomenda na mag-imbak ng hindi hihigit sa 50–100 MB bawat Box. Para sa mas malalaking volume, gamitin ang LazyBox — lazy loading ng records mula sa disk.

Mga transaksyon at concurrency

Hive ay gumagana nang single-threaded sa isolation ng Dart-isolate. Ang mga write operation ay isinasagawa nang synchronously na may file locking. Para sa asynchronous access, gamitin ang Hive.openBox() na may await. Ang concurrent access mula sa maraming isolates ay hindi direktang suportado — para dito kailangan ng hiwalay na synchronization mechanism.

Hive vs SharedPreferences at vs SQLite

Hive ay nasa pagitan ng SharedPreferences at SQLite. Ito ay mas kumplikado kaysa sa SharedPreferences (sumusuporta sa custom na object), ngunit mas simple kaysa sa SQLite (hindi nangangailangan ng SQL queries). Ihambing natin ang mga pangunahing katangian.

KatangianHiveSharedPreferencesSQLite
Uri ng dataLahat (sa pamamagitan ng TypeAdapter)Primitive langSQL types
Bilis ng pagbasa~30 000 ops/s~5 000 ops/s~2 000 ops/s
Native codeHindi kailanganKailangan (Android)Kailangan
Web supportOoHindiHindi
ComplexityMababaMinimalKatamtaman
ReactivityWatchBoxHindiSa pamamagitan ng ORM

Kailan pumili ng Hive

Hive ay optimal para sa maliit na volume ng data: app settings, cache ng API responses, lokal na synchronization queue, favorites at browsing history. Kung ang data ay hindi lalampas sa 50 MB at hindi nangangailangan ng relational queries — ang Hive ay mas mabilis at mas simple kaysa sa SQLite.

Kailan hindi angkop ang Hive

Hive ay hindi sumusuporta sa queries na may filtering sa maraming field, JOIN, aggregate functions. Kung kailangan mo ng complex queries tulad ng “piliin lahat ng tasks ngayong araw na may priority na higit sa 3” — gamitin ang SQLite na may drift o floor. Ang Hive ay hindi rin angkop para sa pag-iimbak ng higit sa 100 MB ng data dahil sa pag-load sa memory.

Mga halimbawa ng code sa Hive

Hive ay nagsisimula sa initialization at pagbubukas ng Box. Sa ibaba ay ang mga basic operation para sa tipikal na scenario — pag-iimbak ng listahan ng tasks sa Flutter app. Lahat ng halimbawa ay gumagana nang walang native platform calls.

Initialization at pagbubukas ng Box

Bago gamitin ang Hive, dapat tawagin ang Hive.initFlutter() sa main function. Pagkatapos buksan ang Box sa pamamagitan ng Hive.openBox() — ang resulta ay isang Box instance na handa para sa pagbasa at pagsulat.

dart
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());
}

CRUD operations

Box ay nagbibigay ng mga method na put, get, delete at naglalaman ng iterator para sa pag-ikot sa lahat ng records. Ang mga key at value ay tina-type sa pamamagitan ng generics — bilang default, ang Box<dynamic> ay pumapayag sa anumang uri, ngunit inirerekomenda na tukuyin ang specific na uri.

dart
// Pagsulat ng data
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', 'Bumili ng produkto');

// Pagbasa
final task = box.get('task_1');

// Lahat ng key
final allTasks = box.values.toList();

// Pag-delete
await box.delete('task_1');

// Paglinis ng Box
await box.clear();

Reactive observation sa pamamagitan ng WatchBox

WatchBox — extension ng Box na nag-aabiso sa mga subscriber tungkol sa mga pagbabago. Sa Flutter, ito ay nag-i-integrate sa ValueListenableBuilder: kapag nagbago ang anumang value sa Box, ang widget ay awtomatikong nagre-rebuild nang hindi tumatawag ng setState.

dart
final watchBox = await Hive.openBox('settings');

// Sa widget
ValueListenableBuilder(
    valueListenable: watchBox.listenable(),
    builder: (context, box, _) {
        final counter = box.get('counter') ?? 0;
        return Text('Counter: $counter');
    },
)

TypeAdapter at custom na object

TypeAdapter — mekanismo ng Hive para sa serialization ng custom na Dart objects. Inilalarawan ng adapter kung paano i-convert ang object sa binary format (write) at pabalik (read). Hindi tulad ng json_serializable, ang TypeAdapter ay hindi nangangailangan ng reflection at mas mabilis gumana.

Paglikha ng TypeAdapter

Ang adapter ay nag-i-implement ng interface na TypeAdapter na may dalawang method: read at write. Ang class ay nirehistro sa pamamagitan ng Hive.registerAdapter() bago buksan ang Box. Bawat adapter ay binibigyan ng numeric ID — naka-save sa file para sa type identification.

dart
// Modelo ng 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);
    }
}

Pag-generate ng adapters sa pamamagitan ng code generation

Para sa mga project na may maraming modelo, ang Hive ay nagbibigay ng hive_generator at build_runner. Ang annotation na @HiveType sa class at @HiveField sa fields ay awtomatikong nagge-generate ng adapter. Ito ay maginhawa kapag ang modelo ay naglalaman ng 10+ fields — ang manual na pagsulat ng read/write ay nagiging labor-intensive.

Optimization ng performance ng Hive

Hive ay nagsasagawa ng pagbasa mula sa memory, hindi mula sa disk, na nagbibigay ng bilis hanggang 30 000 operations bawat segundo. Para sa optimization: buksan ang Box nang isang beses at gamitin muli sa buong app, huwag tawaging muli ang openBox. Gamitin ang Hive.box() (synchronous getter) pagkatapos ng initialization — nagbabalik ng nakabukas nang Box nang hindi gumagawa ng bagong instance.

Hive kasama ang Provider at Riverpod

Hive ay madaling nag-i-integrate sa mga sikat na Flutter state managers. Para sa Provider, gamitin ang ChangeNotifierProvider na nagbabasa ng data mula sa Box sa initialization at nag-a-update sa pamamagitan ng listenable. Para sa Riverpod, ang StreamProvider na naka-subscribe sa WatchBox ay angkop. Ang ganitong kombinasyon ay nagbibigay ng reactive UI updates sa bawat pagbabago ng data sa Hive nang walang manual na setState call. Sa tipikal na Flutter project, ang ganitong arkitektura ay nagpapahintulot ng synchronization ng state sa pagitan ng screens nang walang global singleton.

Mga madalas itanong

Maaari bang gamitin ang Hive nang walang Flutter?

Hive ay gumagana sa purong Dart, kaya maaari itong gamitin sa anumang Dart project: server (Dart VM), console o AngularDart. Para sa Flutter, karagdagang kumokonekta ang hive_flutter na may initialization ng storage paths.

Paano i-encrypt ang data sa Hive?

Hive ay sumusuporta sa AES-256 encryption sa pamamagitan ng parameter na encryptionKey kapag binubuksan ang Box. Ang key ay dapat na 32-byte na string. Ang naka-encrypt na Box ay hindi mababasa nang walang key — ang data ay protektado sa antas ng file.

Ano ang pagkakaiba ng Hive at Isar?

Isar — kahalili ng Hive mula sa parehong may-akda (Simon Leiter). Ang Isar ay mas mabilis, sumusuporta sa indexes, relasyon at complex queries. Gayunpaman, ang Hive ay nananatiling may kaugnayan para sa simpleng scenarios kung saan hindi kailangan ang relational capabilities ng Isar at para sa mga project kung saan mahalaga ang minimal dependency.

Sinusuportahan ba ng Hive ang schema migration?

Hive ay walang built-in na migration. Kung nagbago ang TypeAdapter structure, ang lumang data ay hindi made-deserialize. Solusyon: taasan ang typeId ng adapter at magsulat ng manual migration sa code, o gamitin ang delete para sa lumang key bago magsulat ng bago.

Ano ang maximum size ng Hive Box?

Hive ay nag-lo-load ng Box nang buo sa memory. Ang inirerekomendang limit ay 50–100 MB bawat Box. Kapag lumampas, posible ang pagkaantala sa pagbubukas ng Box at pagtaas ng RAM consumption. Para sa mas malalaking volume, gumamit ng maramihang Box o LazyBox na may lazy loading.

Buod

  • Hive — NoSQL database sa purong Dart, walang native code at platform dependencies
  • Bilis — hanggang 30 000 read operations bawat segundo sa mobile devices
  • TypeAdapter — binary serialization ng custom na object nang walang reflection
  • WatchBox — reactive na pagsubaybay ng pagbabago para sa automatic UI updates
  • Cross-platform — Android, iOS, Web, macOS, Windows, Linux agad
  • Encryption — AES-256 data protection sa antas ng Box file
  • Rekomendasyon — gamitin ang Hive para sa cache, settings at maliit na volume ng data sa Flutter at Dart projects

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din