Hive — nativ kod olmadan işləyən, Flutter üçün yüngül NoSQL anbarı. SQLite və ya Firebase-dən fərqli olaraq, Hive nativ kitabxanaların qoşulmasını tələb etmir və yalnız Dart vasitəsilə işləyir. Pub.dev, 2024-ə görə, Hive 10 milyondan çox dəfə endirilib və server infrastrukturu olmadan lokal məlumat saxlanması tələb olunan hər üç Flutter layihəsindən birində istifadə olunur.
Əsas məqamlar
Hive — tamamilə Dart dilində yazılmış və nativ kitabxanalar tələb etməyən NoSQL verilənlər bazasıdır. Simon Leiter tərəfindən 2019-cu ildə Flutter layihələri üçün SQLite-ə alternativ olaraq yaradılmışdır. Hive məlumatları mobil cihazlarda sürətli oxuma və yazma üçün optimallaşdırılmış .hive ikili formatında saxlayır. .hive formatı fərdi serializasiya sxemindən istifadə edir, burada hər məlumat tipinin öz bayt prefiksi var ki, bu da faylı sxemi əvvəlcədən bilmədən oxumağa imkan verir — Protocol Buffers və ya FlatBuffers-dən fərqli olaraq.
Hive-in əsas ideyası — maksimal sadəlik. Verilənlər bazası nativ mühərriklərin inisializasiyasını tələb etmir, SQL parseri daxil etmir və refleksiyadan istifadə etmir. Bütün əməliyyatlar WriteBuffer və ReadBuffer vasitəsilə ikili serializasiya ilə birbaşa Dart funksiya çağırışlarıdır.
Flutter Community (2023) sorğusuna görə, Hive məlumat saxlama üçün ən çox istifadə olunan 5 paket arasındadır, populyarlıqda yalnız shared_preferences-dən geri qalır, lakin funksionallıq və sürət baxımından onu üstələyir.
Hive Box konsepsiyasından istifadə edir — relyasiyalı verilənlər bazalarında cədvəlin analoqu. Hər Box diskdə açar-dəyər cütləri dəsti olan bir fayldır. Açar int və ya String ola bilər, dəyər — istənilən primitiv tip, siyahı, Map və ya TypeAdapter vasitəsilə xüsusi obyekt. Box-lar bir-birindən təcrid olunur və müstəqil açılır.
Hive platforma kanalları (platform channels) tələb etmir. Bu o deməkdir ki, o, Android, iOS, Web, macOS, Windows və Linux-da əlavə konfiqurasiya olmadan eyni şəkildə işləyir. Web yığımına yönəlmiş layihələr üçün Hive yeganə yüngül NoSQL həlli olaraq qalır — brauzerdə SQLite işləmir. Eyni zamanda Hive web üçün IndexedDB-dən backend kimi istifadə edir ki, bu da brauzer mühitində məlumatların davamlılığını təmin edir.
Hive yazma zamanı məlumatları ikili formata serializasiya edir və oxuma zamanı deserializasiya edir. Daxili mexanizm BinaryWriter və BinaryReader-ə əsaslanır, onlar məlumatları yığcam bayt massivlərinə yığır. Diskdə anbarın ölçüsü eyni məlumatların JSON təqdimatından orta hesabla 2-3 dəfə kiçikdir.
Box açarkən Hive bütün faylı operativ yaddaşa yükləyir. Bu yüksək oxuma sürətini (mikrosaniyələr) təmin edir, lakin məlumatların ölçüsünə məhdudiyyət qoyur: bir Box-da 50-100 MB-dan çox saxlamaq tövsiyə edilmir. Daha böyük həcmlər üçün LazyBox — qeydlərin diskdən tənbəl yüklənməsindən istifadə edin.
Hive Dart izolyatının təcridində tək线程lı işləyir. Yazma əməliyyatları fayl blokadası ilə sinxron şəkildə yerinə yetirilir. Asinxron giriş üçün await ilə Hive.openBox() istifadə edin. Bir neçə izolyatdan paralel giriş birbaşa dəstəklənmir — bunun üçün ayrıca sinxronizasiya mexanizmi lazımdır.
Hive SharedPreferences və SQLite arasında niş tutur. SharedPreferences-dən daha mürəkkəbdir (xüsusi obyektləri dəstəkləyir), lakin SQLite-dən daha sadədir (SQL sorğuları tələb etmir). Əsas xüsusiyyətləri müqayisə edək.
| Xüsusiyyət | Hive | SharedPreferences | SQLite |
|---|---|---|---|
| Məlumat tipləri | İstənilən (TypeAdapter ilə) | Yalnız primitivlər | SQL tipləri |
| Oxuma sürəti | ~30 000 ops/s | ~5 000 ops/s | ~2 000 ops/s |
| Nativ kod | Tələb olunmur | Tələb olunur (Android) | Tələb olunur |
| Web dəstəyi | Bəli | Xeyr | Xeyr |
| Mürəkkəblik | Aşağı | Minimal | Orta |
| Reaktivlik | WatchBox | Xeyr | ORM vasitəsilə |
Hive kiçik həcmli məlumatlar üçün optimaldır: proqram parametrləri, API cavablarının keşi, lokal sinxronizasiya növbəsi, seçilmişlər və baxış tarixçəsi. Məlumatlar 50 MB-dan çox deyilsə və relyasiyalı sorğular tələb olunmursa — Hive SQLite-dən daha sürətli və sadədir.
Hive çox sahə üzrə filtrləmə, JOIN, aqreqat funksiyaları olan sorğuları dəstəkləmir. “Bugünə aid prioriteti 3-dən yuxarı olan bütün tapşırıqları seç” kimi mürəkkəb sorğular lazımdırsa — drift və ya floor ilə SQLite istifadə edin. Hive həmçinin yaddaşa yükləmə səbəbindən 100 MB-dan çox məlumat saxlamaq üçün uyğun deyil.
Hive inisializasiya və Box-ın açılması ilə başlayır. Aşağıda tipik ssenari — Flutter tətbiqində tapşırıqlar siyahısının saxlanması üçün əsas əməliyyatlar verilmişdir. Bütün nümunələr nativ platforma çağırışları olmadan işləyir.
Hive-dən istifadə etməzdən əvvəl main funksiyasında Hive.initFlutter() çağırılmalıdır. Sonra Hive.openBox() vasitəsilə Box açılır — nəticə oxuma və yazma üçün hazır Box nümunəsi olacaq.
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 put, get, delete metodlarını təmin edir və bütün qeydləri gəzmək üçün iteratordan ibarətdir. Açarlar və dəyərlər generiklər vasitəsilə tipləşdirilir — standart olaraq Box<dynamic> istənilən tiplərə icazə verir, lakin konkret tipi göstərmək tövsiyə olunur.
// Məlumatların yazılması
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', 'Məhsulları al');
// Oxuma
final task = box.get('task_1');
// Bütün açarlar
final allTasks = box.values.toList();
// Silme
await box.delete('task_1');
// Box-ın təmizlənməsi
await box.clear();
WatchBox — abunəçilərə dəyişikliklər barədə xəbər verən Box genişləndirilməsi. Flutter-də bu ValueListenableBuilder ilə inteqrasiya olunur: Box-da hər hansı dəyər dəyişdikdə vidjet setState çağırmadan avtomatik yenidən qurulur.
final watchBox = await Hive.openBox('settings');
// Vidjetdə
ValueListenableBuilder(
valueListenable: watchBox.listenable(),
builder: (context, box, _) {
final counter = box.get('counter') ?? 0;
return Text('Sayğac: $counter');
},
)
TypeAdapter — Hive-in xüsusi Dart obyektlərini serializasiya etmək mexanizmi. Adapter obyekti ikili formata (write) və geri (read) çevirməyi təsvir edir. json_serializable-dən fərqli olaraq, TypeAdapter refleksiya tələb etmir və daha sürətli işləyir.
Adapter iki metodu olan TypeAdapter
// Məlumat modeli
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);
}
}
Çox sayda modeli olan layihələr üçün Hive hive_generator və build_runner təqdim edir. Sinifdə @HiveType annotasiyası və sahələrdə @HiveField adapteri avtomatik yaradır. Bu, model 10+ sahə ehtiva etdikdə əlverişlidir — əl ilə read/write yazmaq zəhmətli olur.
Hive oxumanı diskdən deyil, yaddaşdan yerinə yetirir ki, bu da saniyədə 30 000 əməliyyata qədər sürət verir. Optimallaşdırma üçün: Box-ı bir dəfə açın və bütün tətbiq boyu təkrar istifadə edin, openBox-ı təkrar çağırmayın. İnisializasiyadan sonra Hive.box() (sinxron getter) istifadə edin — yeni nümunə yaratmadan artıq açılmış Box-ı qaytarır.
Hive məşhur Flutter state menecerləri ilə asanlıqla inteqrasiya olunur. Provider üçün inisializasiyada Box-dan məlumat oxuyan və listenable vasitəsilə yenilənən ChangeNotifierProvider istifadə edin. Riverpod üçün WatchBox-a abunə olan StreamProvider uyğundur. Belə birləşmə setState-i əl ilə çağırmadan Hive-də hər məlumat dəyişikliyində UI-nin reaktiv yenilənməsini təmin edir. Tipik Flutter layihəsində belə arxitektura qlobal sinqleton olmadan ekranlar arasında vəziyyəti sinxronizasiya etməyə imkan verir.
Tez-tez verilən suallar
Hive təmiz Dart-da işləyir, ona görə də onu istənilən Dart layihəsində istifadə etmək olar: server (Dart VM), konsol və ya AngularDart. Flutter üçün əlavə olaraq saxlama yollarının inisializasiyası ilə hive_flutter qoşulur.
Hive Box açarkən encryptionKey parametri vasitəsilə AES-256 şifrələməsini dəstəkləyir. Açar 32 baytlıq sətir olmalıdır. Şifrələnmiş Box açarsız oxunula bilməz — məlumatlar fayl səviyyəsində qorunur.
Isar — eyni müəllifdən (Simon Leiter) Hive-in varisidir. Isar daha sürətlidir, indeksləri, əlaqələri və mürəkkəb sorğuları dəstəkləyir. Bununla belə, Hive Isar-ın relyasiyalı imkanlarının lazım olmadığı sadə ssenarilər və minimal asılılığın vacib olduğu layihələr üçün aktual olaraq qalır.
Hive daxili miqrasiyalara malik deyil. TypeAdapter strukturu dəyişibsə, köhnə məlumatlar deserializasiya olunmayacaq. Həll yolu: adapterin typeId-sini artırın və koddə əl ilə miqrasiya yazın və ya yeni açarı yazmazdan əvvəl köhnə açar üçün delete istifadə edin.
Hive Box-ı tamamilə yaddaşa yükləyir. Tövsiyə olunan limit bir Box üçün 50-100 MB-dır. Keçdikdə Box-ın açılmasında gecikmələr və RAM istehlakının artması mümkündür. Daha böyük həcmlər üçün bir neçə Box və ya tənbəl yükləmə ilə LazyBox istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun