Hive — lehké NoSQL úložiště pro Flutter, které funguje bez nativního kódu. Na rozdíl od SQLite nebo Firebase, Hive nevyžaduje připojení nativních knihoven a funguje výhradně přes Dart. Podle údajů Pub.dev, 2024 byl Hive stažen více než 10 milionůkrát a používá se v každém třetím Flutter projektu, který vyžaduje lokální ukládání dat bez serverové infrastruktury.
Hlavní body
Hive — je NoSQL databáze napsaná kompletně v Dart, která nevyžaduje nativní knihovny. Byla vytvořena Simonem Leiterem v roce 2019 jako alternativa k SQLite pro Flutter projekty. Hive ukládá data v binárním formátu .hive, který je optimalizován pro rychlé čtení a zápis na mobilních zařízeních. Formát .hive používá vlastní schéma serializace, kde každý typ dat má svůj vlastní bajtový prefix, což umožňuje číst soubor bez předchozí znalosti schématu — na rozdíl od Protocol Buffers nebo FlatBuffers.
Hlavní myšlenka Hive — maximální jednoduchost. Databáze nevyžaduje inicializaci nativních enginů, neobsahuje SQL parser a nepoužívá reflexi. Všechny operace jsou přímé volání Dart funkcí s binární serializací přes WriteBuffer a ReadBuffer.
Podle průzkumu Flutter Community (2023) je Hive v top 5 nejpoužívanějších balíčků pro ukládání dat ve Flutter, hned za shared_preferences v popularitě, ale předčí ho ve funkcionalitě a rychlosti.
Hive používá koncept Box — analog tabulky v relačních databázích. Každý Box je soubor na disku se sadou párů klíč-hodnota. Klíč může být int nebo String, hodnota — jakýkoli primitivní typ, seznam, Map nebo vlastní objekt přes TypeAdapter. Box-y jsou od sebe izolovány a otevírají se nezávisle.
Hive nevyžaduje platformní kanály (platform channels). To znamená, že funguje stejně na Android, iOS, Web, macOS, Windows a Linux bez dodatečné konfigurace. Pro projekty zaměřené na webovou kompilaci zůstává Hive jediným lehkým NoSQL řešením — SQLite v prohlížeči nefunguje. Zároveň Hive používá IndexedDB jako backend pro web, což zajišťuje perzistenci dat i v prostředí prohlížeče.
Hive serializuje data do binárního formátu při zápisu a deserializuje při čtení. Vnitřní mechanismus je založen na BinaryWriter a BinaryReader, které balí data do kompaktních bajtových polí. Velikost úložiště na disku je v průměru 2–3krát menší než JSON reprezentace stejných dat.
Při otevření Boxu Hive načte celý soubor do RAM. To zajišťuje vysokou rychlost čtení (mikrosekundy), ale ukládá omezení na velikost dat: doporučuje se ukládat nejvýše 50–100 MB na jeden Box. Pro větší objemy použijte LazyBox — líné načítání záznamů z disku.
Hive pracuje jednovláknově v izolaci Dart izolátu. Zápisové operace se provádějí synchronně s uzamčením souboru. Pro asynchronní přístup použijte Hive.openBox() s await. Souběžný přístup z více izolátů není přímo podporován — k tomu je potřeba samostatný synchronizační mechanismus.
Hive zaujímá mezeru mezi SharedPreferences a SQLite. Je složitější než SharedPreferences (podporuje vlastní objekty), ale jednodušší než SQLite (nevyžaduje SQL dotazy). Porovnejme klíčové charakteristiky.
| Charakteristika | Hive | SharedPreferences | SQLite |
|---|---|---|---|
| Typy dat | Libovolné (přes TypeAdapter) | Pouze primitivy | SQL typy |
| Rychlost čtení | ~30 000 ops/s | ~5 000 ops/s | ~2 000 ops/s |
| Nativní kód | Není potřeba | Je potřeba (Android) | Je potřeba |
| Web podpora | Ano | Ne | Ne |
| Složitost | Nízká | Minimální | Střední |
| Reaktivita | WatchBox | Ne | Přes ORM |
Hive je optimální pro malé objemy dat: nastavení aplikace, cache API odpovědí, lokální synchronizační fronta, oblíbené a historie prohlížení. Pokud data nepřesahují 50 MB a nevyžadují relační dotazy — Hive je rychlejší a jednodušší než SQLite.
Hive nepodporuje dotazy s filtrováním podle více polí, JOIN, agregační funkce. Pokud potřebujete složité dotazy typu “vyber všechny úkoly na dnešek s prioritou vyšší než 3” — použijte SQLite s drift nebo floor. Hive také není vhodný pro ukládání více než 100 MB dat kvůli načítání do paměti.
Hive začíná inicializací a otevřením Boxu. Níže jsou uvedeny základní operace pro typický scénář — ukládání seznamu úkolů ve Flutter aplikaci. Všechny příklady fungují bez nativních platformních volání.
Před použitím Hive je nutné zavolat Hive.initFlutter() v main funkci. Poté otevřete Box pomocí Hive.openBox() — výsledkem bude instance Box připravená ke čtení a zápisu.
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 poskytuje metody put, get, delete a obsahuje iterátor pro procházení všech záznamů. Klíče a hodnoty jsou typovány pomocí generik — ve výchozím nastavení Box<dynamic> povoluje libovolné typy, ale doporučuje se zadat konkrétní typ.
// Zápis dat
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', 'Koupit produkty');
// Čtení
final task = box.get('task_1');
// Všechny klíče
final allTasks = box.values.toList();
// Smazání
await box.delete('task_1');
// Vyčištění Boxu
await box.clear();
WatchBox — rozšíření Boxu, které upozorňuje odběratele na změny. Ve Flutter se to integruje s ValueListenableBuilder: při změně jakékoli hodnoty v Boxu se widget automaticky přestaví bez volání setState.
final watchBox = await Hive.openBox('settings');
// Ve widgetu
ValueListenableBuilder(
valueListenable: watchBox.listenable(),
builder: (context, box, _) {
final counter = box.get('counter') ?? 0;
return Text('Počítadlo: $counter');
},
)
TypeAdapter — mechanismus Hive pro serializaci vlastních Dart objektů. Adaptér popisuje, jak převést objekt do binárního formátu (write) a zpět (read). Na rozdíl od json_serializable, TypeAdapter nevyžaduje reflexi a pracuje rychleji.
Adaptér implementuje rozhraní TypeAdapter
// Datový model
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);
}
}
Pro projekty s velkým množstvím modelů poskytuje Hive hive_generator a build_runner. Anotace @HiveType na třídě a @HiveField na polích generuje adaptér automaticky. To je výhodné, když model obsahuje 10+ polí — ruční psaní read/write se stává pracným.
Hive provádí čtení z paměti, nikoli z disku, což poskytuje rychlost až 30 000 operací za sekundu. Pro optimalizaci: otevřete Box jednou a znovu jej používejte v celé aplikaci, nevolajte openBox znovu. Po inicializaci použijte Hive.box() (synchronní getter) — vrací již otevřený Box bez vytváření nové instance.
Hive se snadno integruje s populárními správci stavu Flutter. Pro Provider použijte ChangeNotifierProvider, který čte data z Boxu při inicializaci a aktualizuje se přes listenable. Pro Riverpod je vhodný StreamProvider přihlášený k odběru WatchBox. Taková kombinace poskytuje reaktivní aktualizaci UI při každé změně dat v Hive bez ručního volání setState. V typickém Flutter projektu taková architektura umožňuje synchronizaci stavu mezi obrazovkami bez globálního singletonu.
Často kladené otázky
Hive funguje v čistém Dart, takže jej lze použít v jakémkoli Dart projektu: serverovém (Dart VM), konzolovém nebo AngularDart. Pro Flutter se dodatečně připojuje hive_flutter s inicializací cest úložiště.
Hive podporuje šifrování AES-256 přes parametr encryptionKey při otevírání Boxu. Klíč musí být 32bajtový řetězec. Zašifrovaný Box nelze číst bez klíče — data jsou chráněna na úrovni souboru.
Isar — nástupce Hive od stejného autora (Simon Leiter). Isar je rychlejší, podporuje indexy, relace a složité dotazy. Hive však zůstává relevantní pro jednoduché scénáře, kde nejsou potřeba relační schopnosti Isar, a pro projekty, kde je důležitá minimální závislost.
Hive nemá vestavěné migrace. Pokud se struktura TypeAdapter změnila, stará data se nebudou deserializovat. Řešení: zvyšte typeId adaptéru a napište ruční migraci v kódu nebo použijte delete pro starý klíč před zápisem nového.
Hive načítá Box zcela do paměti. Doporučený limit je 50–100 MB na jeden Box. Při překročení jsou možné prodlevy při otevírání Boxu a zvýšená spotřeba RAM. Pro větší objemy použijte více Boxů nebo LazyBox s líným načítáním.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také