Hive: bu nədir, NoSQL anbarı və nativ kod olmadan inkişaf

Müəllif: IT Sectr Dərc olunub: 2026-03-13 Oxuma vaxtı: 9 dəq

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 — təmiz Dart üzərində NoSQL verilənlər bazası, nativ kod və platforma asılılıqları olmadan
  • Performans — mobil cihazda saniyədə 30 000 oxuma əməliyyatına qədər
  • Tipizasiya — xüsusi obyektlər üçün TypeAdapter, kod generasiyası olmadan
  • Yüngüllük — Android SDK və ya iOS UIKit-dən 0 asılılıq
  • Reaktiv — real vaxtda dəyişiklikləri izləmək üçün WatchBox

Hive nədir?

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 WriteBufferReadBuffer 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 arxitekturası

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.

Nativ həllərə qarşı üstünlüklə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 necə işləyir?

Hive yazma zamanı məlumatları ikili formata serializasiya edir və oxuma zamanı deserializasiya edir. Daxili mexanizm BinaryWriterBinaryReader-ə ə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.

Transaksiyalar və paralellik

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

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ətHiveSharedPreferencesSQLite
Məlumat tipləriİstənilən (TypeAdapter ilə)Yalnız primitivlərSQL tipləri
Oxuma sürəti~30 000 ops/s~5 000 ops/s~2 000 ops/s
Nativ kodTələb olunmurTələb olunur (Android)Tələb olunur
Web dəstəyiBəliXeyrXeyr
MürəkkəblikAşağıMinimalOrta
ReaktivlikWatchBoxXeyrORM vasitəsilə

Hive nə vaxt seçilməli

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 nə vaxt uyğun deyil

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 ilə kod nümunələri

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.

İnisializasiya və Box-ın açılması

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.

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 əməliyyatları

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.

dart
// 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 vasitəsilə reaktiv müşahidə

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.

dart
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 və xüsusi obyektlər

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.

TypeAdapter yaradılması

Adapter iki metodu olan TypeAdapter interfeysini reallaşdırır: read və write. Sinif Box açılmazdan əvvəl Hive.registerAdapter() vasitəsilə qeydiyyatdan keçirilir. Hər adapterə tipi identifikasiya etmək üçün faylda saxlanılan ədədi ID verilir.

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

Kod generasiyası vasitəsilə adapterlərin yaradılması

Çox sayda modeli olan layihələr üçün Hive hive_generatorbuild_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 performansının optimallaşdırılması

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 Provider və Riverpod ilə birlikdə

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-dən Flutter olmadan istifadə etmək olar?

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-də məlumatları necə şifrələmək olar?

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.

Hive Isar-dan nə ilə fərqlənir?

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 sxem miqrasiyasını dəstəkləyir?

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-ın maksimum ölçüsü nədir?

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ə

  • Hive — təmiz Dart-da NoSQL verilənlər bazası, nativ kod və platforma asılılıqları olmadan
  • Sürət — mobil cihazlarda saniyədə 30 000 oxuma əməliyyatına qədər
  • TypeAdapter — refleksiya olmadan xüsusi obyektlərin ikili serializasiyası
  • WatchBox — UI-nin avtomatik yenilənməsi üçün dəyişikliklərin reaktiv izlənməsi
  • Çoxplatformalılıq — Android, iOS, Web, macOS, Windows, Linux qutu kənarı
  • Şifrələmə — Box faylı səviyyəsində AES-256 məlumat qorunması
  • Tövsiyə — Flutter və Dart layihələrində keş, parametrlər və kiçik həcmli məlumatlar üçün Hive istifadə edin

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.

Layihəni müzakirə et

Həm də oxuyun