Hive ist ein leichtgewichtiger NoSQL-Speicher für Flutter, der ohne nativen Code auskommt. Im Gegensatz zu SQLite oder Firebase benötigt Hive keine nativen Bibliotheken und funktioniert ausschließlich über Dart. Laut Pub.dev, 2024 wurde Hive über 10 Millionen Mal heruntergeladen und wird in jedem dritten Flutter-Projekt verwendet, das lokale Datenspeicherung ohne Serverinfrastruktur benötigt.
Wichtige Punkte
Hive ist eine vollständig in Dart geschriebene NoSQL-Datenbank, die keine nativen Bibliotheken benötigt. Sie wurde 2019 von Simon Leiter als Alternative zu SQLite für Flutter-Projekte entwickelt. Hive speichert Daten im binären .hive-Format, das für schnelles Lesen und Schreiben auf mobilen Geräten optimiert ist. Das .hive-Format verwendet ein benutzerdefiniertes Serialisierungsschema, bei dem jeder Datentyp sein eigenes Byte-Präfix hat, sodass die Datei ohne vorherige Schemakenntnis gelesen werden kann — im Gegensatz zu Protocol Buffers oder FlatBuffers.
Die Kernidee von Hive ist maximale Einfachheit. Die Datenbank benötigt keine Initialisierung nativer Engines, enthält keinen SQL-Parser und verwendet keine Reflexion. Alle Operationen sind direkte Dart-Funktionsaufrufe mit binärer Serialisierung über WriteBuffer und ReadBuffer.
Laut der Flutter Community Umfrage (2023) gehört Hive zu den 5 am häufigsten verwendeten Datenspeicherpaketen in Flutter, liegt in der Beliebtheit nur hinter shared_preferences, übertrifft es jedoch an Funktionalität und Geschwindigkeit.
Hive verwendet das Konzept eines Box — analog zu einer Tabelle in relationalen Datenbanken. Jeder Box ist eine Datei auf der Festplatte mit einer Reihe von Schlüssel-Wert-Paaren. Der Schlüssel kann int oder String sein, der Wert kann ein beliebiger primitiver Typ, eine Liste, Map oder ein benutzerdefiniertes Objekt über TypeAdapter sein. Boxes sind voneinander isoliert und werden unabhängig geöffnet.
Hive benötigt keine Plattformkanäle. Das bedeutet, es funktioniert auf Android, iOS, Web, macOS, Windows und Linux ohne zusätzliche Einrichtung gleich. Für Projekte, die auf Web-Builds abzielen, bleibt Hive die einzige leichtgewichtige NoSQL-Lösung — SQLite funktioniert nicht im Browser. Hive verwendet IndexedDB als Backend für das Web und gewährleistet so Datenpersistenz auch in der Browserumgebung.
Hive serialisiert Daten beim Schreiben in ein binäres Format und deserialisiert sie beim Lesen. Der interne Mechanismus basiert auf BinaryWriter und BinaryReader, die Daten in kompakte Byte-Arrays packen. Die Speichergröße auf der Festplatte ist durchschnittlich 2–3 Mal kleiner als die JSON-Darstellung derselben Daten.
Beim Öffnen eines Box lädt Hive die gesamte Datei in den RAM. Dies bietet hohe Lesegeschwindigkeit (Mikrosekunden), erzwingt jedoch eine Größenbeschränkung: Es wird empfohlen, nicht mehr als 50–100 MB pro Box zu speichern. Für größere Volumen verwenden Sie LazyBox — verzögertes Laden von Datensätzen von der Festplatte.
Hive arbeitet single-threaded innerhalb eines Dart-Isolats. Schreiboperationen werden synchron mit Dateisperrung ausgeführt. Für asynchronen Zugriff verwenden Sie Hive.openBox() mit await. Gleichzeitiger Zugriff aus mehreren Isolaten wird nicht direkt unterstützt — ein separater Synchronisationsmechanismus ist erforderlich.
Hive nimmt eine Nische zwischen SharedPreferences und SQLite ein. Es ist komplexer als SharedPreferences (unterstützt benutzerdefinierte Objekte), aber einfacher als SQLite (keine SQL-Abfragen erforderlich). Vergleichen wir die wichtigsten Merkmale.
| Merkmal | Hive | SharedPreferences | SQLite |
|---|---|---|---|
| Datentypen | Beliebig (über TypeAdapter) | Nur primitive | SQL-Typen |
| Lesegeschwindigkeit | ~30.000 ops/s | ~5.000 ops/s | ~2.000 ops/s |
| Nativer Code | Nicht erforderlich | Erforderlich (Android) | Erforderlich |
| Web-Support | Ja | Nein | Nein |
| Komplexität | Niedrig | Minimal | Mittel |
| Reaktivität | WatchBox | Nein | Über ORM |
Hive ist optimal für kleine Datenmengen: App-Einstellungen, Cache von API-Antworten, lokale Synchronisationswarteschlange, Favoriten und Browserverlauf. Wenn die Daten 50 MB nicht überschreiten und keine relationalen Abfragen benötigen — ist Hive schneller und einfacher als SQLite.
Hive unterstützt keine Abfragen mit Filterung nach mehreren Feldern, JOIN oder Aggregatfunktionen. Wenn Sie komplexe Abfragen wie „alle Aufgaben für heute mit Priorität über 3 auswählen“ benötigen — verwenden Sie SQLite mit drift oder floor. Hive ist auch nicht geeignet für die Speicherung von mehr als 100 MB Daten aufgrund der Speicherladung.
Hive beginnt mit der Initialisierung und dem Öffnen eines Box. Nachfolgend sind die grundlegenden Operationen für ein typisches Szenario — Speichern einer Aufgabenliste in einer Flutter-Anwendung. Alle Beispiele funktionieren ohne native Plattformaufrufe.
Vor der Verwendung von Hive muss Hive.initFlutter() in der main-Funktion aufgerufen werden. Öffnen Sie dann einen Box über Hive.openBox() — das Ergebnis ist eine Box-Instanz, die zum Lesen und Schreiben bereit ist.
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 bietet die Methoden put, get, delete und einen Iterator zum Durchlaufen aller Einträge. Schlüssel und Werte werden über Generics typisiert — standardmäßig akzeptiert Box<dynamic> jeden Typ, aber es wird empfohlen, einen konkreten Typ anzugeben.
// Daten schreiben
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', 'Lebensmittel kaufen');
// Lesen
final task = box.get('task_1');
// Alle Schlüssel
final allTasks = box.values.toList();
// Löschen
await box.delete('task_1');
// Box leeren
await box.clear();
WatchBox ist eine Erweiterung von Box, die Abonnenten über Änderungen benachrichtigt. In Flutter wird dies mit ValueListenableBuilder integriert: Wenn sich ein Wert im Box ändert, wird das Widget automatisch ohne Aufruf von setState neu aufgebaut.
final watchBox = await Hive.openBox('settings');
// Im Widget
ValueListenableBuilder(
valueListenable: watchBox.listenable(),
builder: (context, box, _) {
final counter = box.get('counter') ?? 0;
return Text('Zähler: $counter');
},
)
TypeAdapter ist der Mechanismus von Hive zur Serialisierung benutzerdefinierter Dart-Objekte. Der Adapter beschreibt, wie ein Objekt in ein binäres Format (write) und zurück (read) konvertiert wird. Im Gegensatz zu json_serializable benötigt TypeAdapter keine Reflexion und ist schneller.
Der Adapter implementiert das TypeAdapter
// Datenmodell
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);
}
}
Für Projekte mit einer großen Anzahl von Modellen bietet Hive hive_generator und build_runner. Die Annotation @HiveType auf der Klasse und @HiveField auf Feldern generieren den Adapter automatisch. Dies ist praktisch, wenn das Modell 10+ Felder hat — manuelles Schreiben von read/write wird mühsam.
Hive liest aus dem Speicher statt von der Festplatte und bietet Geschwindigkeiten von bis zu 30.000 Operationen pro Sekunde. Zur Optimierung: Öffnen Sie einen Box einmal und verwenden Sie ihn in der gesamten App wieder, rufen Sie openBox nicht wiederholt auf. Verwenden Sie Hive.box() (synchroner Getter) nach der Initialisierung — er gibt einen bereits geöffneten Box zurück, ohne eine neue Instanz zu erstellen.
Hive lässt sich einfach mit gängigen Flutter-Zustandsverwaltern integrieren. Für Provider verwenden Sie ChangeNotifierProvider, der Daten beim Initialisieren aus dem Box liest und über listenable aktualisiert wird. Für Riverpod eignet sich ein StreamProvider, der auf WatchBox abonniert ist. Diese Kombination bietet reaktive UI-Updates bei jeder Datenänderung in Hive ohne manuellen setState-Aufruf. In einem typischen Flutter-Projekt ermöglicht diese Architektur die Synchronisierung des Zustands zwischen Bildschirmen ohne globales Singleton.
Häufig gestellte Fragen
Hive funktioniert auf reinem Dart, daher kann es in jedem Dart-Projekt verwendet werden: serverseitig (Dart VM), Konsolenanwendung oder AngularDart. Für Flutter wird zusätzlich hive_flutter zur Initialisierung der Speicherpfade benötigt.
Hive unterstützt AES-256-Verschlüsselung über den Parameter encryptionKey beim Öffnen eines Box. Der Schlüssel muss ein 32-Byte-String sein. Ein verschlüsselter Box kann ohne Schlüssel nicht gelesen werden — die Daten sind auf Dateiebene geschützt.
Isar ist der Nachfolger von Hive vom selben Autor (Simon Leiter). Isar ist schneller, unterstützt Indizes, Beziehungen und komplexe Abfragen. Hive bleibt jedoch für einfache Szenarien relevant, in denen Isars relationale Fähigkeiten nicht benötigt werden, und für Projekte, bei denen minimale Abhängigkeiten wichtig sind.
Hive hat keine eingebauten Migrationen. Wenn sich die TypeAdapter-Struktur ändert, werden alte Daten nicht deserialisiert. Lösung: Erhöhen Sie die typeId des Adapters und schreiben Sie eine manuelle Migration im Code, oder verwenden Sie delete für den alten Schlüssel vor dem Schreiben eines neuen.
Hive lädt den Box vollständig in den Speicher. Die empfohlene Grenze liegt bei 50–100 MB pro Box. Eine Überschreitung kann zu Verzögerungen beim Öffnen des Box und erhöhtem RAM-Verbrauch führen. Für größere Volumen verwenden Sie mehrere Boxes oder LazyBox mit verzögertem Laden.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch