Hive: Was ist das, NoSQL-Speicher und Entwicklung ohne nativen Code

Autor: IT Sectr Veröffentlicht: 2026-03-13 Lesezeit: 9 Min.

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 — NoSQL-DB in reinem Dart, ohne nativen Code oder Plattformabhängigkeiten
  • Leistung — bis zu 30.000 Lesevorgänge pro Sekunde auf einem mobilen Gerät
  • Typisierung — TypeAdapter für benutzerdefinierte Objekte, ohne Codegenerierung
  • Leichtigkeit — null Abhängigkeiten von Android SDK oder iOS UIKit
  • Reaktiv — WatchBox zur Echtzeit-Änderungsverfolgung

Was ist Hive?

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-Architektur

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.

Vorteile gegenüber nativen Lösungen

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.

Wie funktioniert Hive?

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.

Transaktionen und Nebenläufigkeit

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 vs SharedPreferences vs SQLite

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.

MerkmalHiveSharedPreferencesSQLite
DatentypenBeliebig (über TypeAdapter)Nur primitiveSQL-Typen
Lesegeschwindigkeit~30.000 ops/s~5.000 ops/s~2.000 ops/s
Nativer CodeNicht erforderlichErforderlich (Android)Erforderlich
Web-SupportJaNeinNein
KomplexitätNiedrigMinimalMittel
ReaktivitätWatchBoxNeinÜber ORM

Wann Hive wählen

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.

Wann Hive nicht geeignet ist

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.

Codebeispiele mit Hive

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.

Initialisierung und Öffnen eines Box

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.

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-Operationen

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.

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

Reaktive Beobachtung über WatchBox

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.

dart
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 und benutzerdefinierte Objekte

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.

Erstellen eines TypeAdapter

Der Adapter implementiert das TypeAdapter-Interface mit zwei Methoden: read und write. Die Klasse wird über Hive.registerAdapter() vor dem Öffnen des Box registriert. Jeder Adapter erhält eine numerische ID — sie wird zur Typidentifikation in der Datei gespeichert.

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

Generierung von Adaptern durch Codegenerierung

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.

Optimierung der Hive-Leistung

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 mit Provider und Riverpod

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

Kann man Hive ohne Flutter verwenden?

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.

Wie verschlüsselt man Daten in Hive?

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.

Wie unterscheidet sich Hive von Isar?

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.

Unterstützt Hive Schema-Migrationen?

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.

Wie groß ist die maximale Box-Größe in Hive?

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

  • Hive — NoSQL-DB in reinem Dart, ohne nativen Code oder Plattformabhängigkeiten
  • Leistung — bis zu 30.000 Leseoperationen pro Sekunde auf mobilen Geräten
  • TypeAdapter — binäre Serialisierung benutzerdefinierter Objekte ohne Reflexion
  • WatchBox — reaktive Änderungsverfolgung für automatische UI-Updates
  • Plattformübergreifend — Android, iOS, Web, macOS, Windows, Linux sofort einsatzbereit
  • Verschlüsselung — AES-256-Datenschutz auf Box-Dateiebene
  • Empfehlung — Verwenden Sie Hive für Caching, Einstellungen und kleine Datenmengen in Flutter- und Dart-Projekten

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.

Projekt besprechen

Lesen Sie auch