Introduction à Hive et comparaison avec SQLite, Drift et ObjectBox
Introduction à Hive et comparaison avec SQLite, Drift et ObjectBox
-
Objectif
- Comprendre ce qu’est Hive.
- Savoir pourquoi l’utiliser dans une application Flutter.
- Apprendre à installer et configurer Hive.
- Maîtriser les opérations CRUD (Create, Read, Update, Delete).
- Utiliser Hive avec des objets personnalisés grâce aux adapters.
- Découvrir les bonnes pratiques et comparer Hive avec d’autres solutions de persistance.
-
🚀 Qu’est-ce que Hive ?
- Hive est une base de données NoSQL écrite en pur Dart.
- Elle est rapide, légère et offline-first (fonctionne sans internet).
- Hive stocke les données sous forme de paires clé-valeur et est optimisée pour des opérations de lecture-écriture rapides.
- Elle permet de stocker des données localement sur l’appareil.
- Idéale pour :
- Stocker des paramètres (ex : thème sombre/clair).
- Sauvegarder des favoris.
- Créer un cache local pour éviter les appels API répétés.
- Stocker des objets simples (utilisateurs, produits, etc.).
-
Architecture interne de Hive
- Hive repose sur une architecture clé-valeur optimisée.
- Composants internes
- Boxes :
- Contiennent les données (clé-valeur).
- Peuvent être persistantes ou temporaires (in-memory).
- HiveObject / TypeAdapters :
- Permettent de stocker des objets Dart complexes.
- Ex. UserAdapter pour convertir User en binaire et inversement.
- Moteur de stockage :
- Basé sur des fichiers binaires .hive.
- Optimisé pour I/O séquentiel.
- LazyBox :
- Chargement paresseux (utile pour grandes quantités de données).
-
📦 Les Boxes dans Hive
- Toutes les données dans Hive Flutter sont organisées et stockées dans des
boxes
. - On peut les comparer à des tables en SQL, mais elles n’ont pas de structure fixe et peuvent stocker n’importe quel type de données.
- Une seule box peut suffire pour des petites applications.
- Les boxes peuvent aussi être chiffrées pour plus de sécurité.
-
🔑 Ouvrir une Box
- Une box doit être ouverte avant de pouvoir être utilisée.
- Lorsqu’elle est ouverte, toutes les données du stockage local sont chargées en mémoire pour un accès immédiat.
-
📋 Description des paramètres
-
📂 Récupérer une Box ouverte
- Hive Flutter conserve une référence de toutes les boxes ouvertes.
- Pour accéder à une box déjà ouverte :
-
❌ Fermer une Box
- Si une box n’est plus nécessaire, il faut la fermer.
- Lors de la fermeture, tous les fichiers de cache et valeurs sont supprimés.
- Si l’application est encore en cours, laissez la box ouverte.
-
🧩 Paramètre de type :
Box<E>
- Vous pouvez spécifier le type des valeurs d’une box.
- La box peut aussi contenir des sous-types de
User
. - ⚠️ Attention : la même box ne peut pas être ouverte plusieurs fois avec des paramètres de type différents.
-
🐌 Lazy Box
- Lorsqu’une box est ouverte, son contenu est chargé en mémoire.
- Cela fonctionne pour les petites applications, mais pas pour les grandes.
- Avec une Lazy Box, seules les clés sont gardées en mémoire. Les valeurs sont lues depuis le disque au moment de l’accès.
-
🔐 Encrypted Box
- Hive Flutter supporte le chiffrement AES-256 pour stocker les données.
- 👉 Une clé de 256 bits est nécessaire.
- Hive peut générer une clé sécurisée que vous stockez avant d’ouvrir la box.
- ⚠️ Seules les valeurs sont chiffrées, les clés restent en clair.
- ⚠️ Si une mauvaise clé est utilisée, des comportements inattendus peuvent survenir.
-
⚡ Comparaison avec SQLite, Drift et ObjectBox
-
Architecture interne de Hive
var box = await Hive.openBox<E>('testBox');
Paramètre | Description |
---|---|
name |
Spécifie l’emplacement de stockage et vérifie si une box du même nom existe déjà (sensible à la casse). |
encryptionKey |
Tableau de bytes de taille 32 utilisé pour le chiffrement et le déchiffrement des valeurs. |
keyComparator |
Permet de personnaliser l’ordre de tri des clés (par défaut lexicographique). |
compactionStrategy |
Définit les règles de compaction automatique. |
crashRecovery |
En cas d’arrêt brutal pendant une écriture, la dernière entrée est supprimée. Peut être personnalisé. |
path |
Répertoire de stockage défini par Hive.init() . Peut être modifié. |
bytes |
Permet d’utiliser une box sous forme binaire comme backend. |
var box = Hive.box('myBox');
var box = await Hive.openBox('myBox');
await box.put('hello', 'world');
await box.close();
⚠️ Avant de quitter l’application, vous devez fermer les boxes utilisées.
var box = await Hive.openBox<User>('users');
box.add(User());
box.add(5); // Erreur de compilation
var lazyBox = await Hive.openLazyBox('myLazyBox');
var value = await lazyBox.get('lazyVal');
Obtenir une Lazy Box déjà ouverte :
var lazyBox = Hive.lazyBox('myLazyBox');
import 'dart:convert';
import 'package:hive/hive.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
void main() async {
const secureStorage = FlutterSecureStorage();
// Lire la clé stockée (ou null si absente)
final encryptionKeyString = await secureStorage.read(key: 'key');
if (encryptionKeyString == null) {
final key = Hive.generateSecureKey();
await secureStorage.write(
key: 'key',
value: base64UrlEncode(key),
);
}
final key = await secureStorage.read(key: 'key');
final encryptionKeyUint8List = base64Url.decode(key!);
print('Clé de chiffrement Uint8List: $encryptionKeyUint8List');
final encryptedBox = await Hive.openBox(
'vaultBox',
encryptionCipher: HiveAesCipher(encryptionKeyUint8List),
);
encryptedBox.put('secret', 'Hive est génial');
print(encryptedBox.get('secret'));
}
Critère | Hive 🐝 | SQLite 🗄️ | Drift ⚙️ | ObjectBox 📦 |
---|---|---|---|---|
Type | NoSQL clé-valeur | SQL relationnelle | ORM SQL en Dart | NoSQL orienté objet |
Performance | 🚀 Très rapide | Bonne | Bonne | 🚀 Très rapide |
Complexité | Simple | Élevée (SQL) | Intermédiaire | Simple |
Relations | ❌ Non natif | ✅ Oui | ✅ Oui | ✅ Oui |
Cas d’usage | Cache, préférences | Données relationnelles | Apps complexes avec relations | Objets interconnectés |