Hive: bu nima, NoSQL ombori va mahalliy kodsiz ishlab chiqish

Muallif: IT Sectr Nashr etilgan: 2026-03-13 O'qish vaqti: 9 daq

Hive — mahalliy kodsiz ishlaydigan, Flutter uchun yengil NoSQL ma'lumotlar ombori. SQLite yoki Firebase-dan farqli o'laroq, Hive mahalliy kutubxonalarni ulashni talab qilmaydi va faqat Dart orqali ishlaydi. Pub.dev, 2024 ma'lumotlariga ko'ra, Hive 10 million martadan ko'proq yuklab olingan va server infratuzilmasisiz mahalliy ma'lumotlarni saqlash talab qilinadigan har uchinchi Flutter loyihasida ishlatiladi.

Asosiy fikrlar

  • Hive — sof Dart-dagi NoSQL ma'lumotlar bazasi, mahalliy kod va platforma bog'liqliklarisiz
  • Unumdorlik — mobil qurilmada sekundiga 30 000 o'qishgacha
  • Tiplashtirish — maxsus obyektlar uchun TypeAdapter, kod generatsiyasisiz
  • Yengillik — Android SDK yoki iOS UIKit dan 0 bog'liqlik
  • Reaktiv — real vaqtda o'zgarishlarni kuzatish uchun WatchBox

Hive nima?

Hive — bu butunlay Dart-da yozilgan va mahalliy kutubxonalarni talab qilmaydigan NoSQL ma'lumotlar bazasidir. U Simon Leiter tomonidan 2019 yilda Flutter loyihalari uchun SQLite ga alternativa sifatida yaratilgan. Hive ma'lumotlarni mobil qurilmalarda tez o'qish va yozish uchun optimallashtirilgan .hive ikkilik formatida saqlaydi. .hive formati maxsus serializatsiya sxemasidan foydalanadi, unda har bir ma'lumot turi o'z bayt prefiksiga ega bo'lib, bu faylni sxemani oldindan bilmasdan o'qish imkonini beradi — Protocol Buffers yoki FlatBuffers dan farqli o'laroq.

Hive ning asosiy g'oyasi — maksimal soddalik. Ma'lumotlar bazasi mahalliy dvigatellarni ishga tushirishni talab qilmaydi, SQL parserni o'z ichiga olmaydi va refleksiyadan foydalanmaydi. Barcha operatsiyalar WriteBuffer va ReadBuffer orqali ikkilik serializatsiya bilan to'g'ridan-to'g'ri Dart funksiya chaqiruvlaridir.

Flutter Community (2023) so'roviga ko'ra, Hive Flutter da ma'lumotlarni saqlash uchun eng ko'p ishlatiladigan 5 ta paket ichida bo'lib, mashhurlik bo'yicha faqat shared_preferences dan keyin turadi, lekin funksionallik va tezlik jihatidan undan ustun turadi.

Hive arxitekturasi

Hive Box konsepsiyasidan foydalanadi — relyatsion ma'lumotlar bazalaridagi jadvalning analogi. Har bir Box diskda kalit-qiymat juftliklari to'plami bo'lgan fayldir. Kalit int yoki String bo'lishi mumkin, qiymat — har qanday primitiv tip, ro'yxat, Map yoki TypeAdapter orqali maxsus obyekt. Box lar bir-biridan izolyatsiya qilingan va mustaqil ravishda ochiladi.

Mahalliy yechimlarga nisbatan afzalliklar

Hive platforma kanallarini (platform channels) talab qilmaydi. Bu shuni anglatadiki, u Android, iOS, Web, macOS, Windows va Linux da qo'shimcha sozlamalarsiz bir xil ishlaydi. Web yig'ishga yo'naltirilgan loyihalar uchun Hive yagona yengil NoSQL yechim bo'lib qoladi — brauzerda SQLite ishlamaydi. Shu bilan birga, Hive web uchun IndexedDB dan backend sifatida foydalanadi, bu brauzer muhitida ma'lumotlarning saqlanishini ta'minlaydi.

Hive qanday ishlaydi?

Hive yozish vaqtida ma'lumotlarni ikkilik formatga serializatsiya qiladi va o'qish vaqtida deserializatsiya qiladi. Ichki mexanizm BinaryWriter va BinaryReader ga asoslangan bo'lib, ular ma'lumotlarni ixcham bayt massivlariga joylaydi. Diskdagi ombor hajmi bir xil ma'lumotlarning JSON ko'rinishidan o'rtacha 2-3 marta kichikroq.

Box ochilganda, Hive butun faylni operativ xotiraga yuklaydi. Bu yuqori o'qish tezligini (mikrosoniyalar) ta'minlaydi, lekin ma'lumotlar hajmiga cheklov qo'yadi: bitta Box da 50-100 MB dan ortiq saqlash tavsiya etilmaydi. Kattaroq hajmlar uchun LazyBox — yozuvlarni diskdan kechiktirib yuklashdan foydalaning.

Tranzaksiyalar va parallellik

Hive Dart izolyati izolyatsiyasida bir yo'nalishli ishlaydi. Yozish operatsiyalari faylni blokirovka qilish bilan sinxron ravishda bajariladi. Asinxron kirish uchun await bilan Hive.openBox() dan foydalaning. Bir nechta izolyatlardan parallel kirish to'g'ridan-to'g'ri qo'llab-quvvatlanmaydi — buning uchun alohida sinxronlash mexanizmi kerak.

Hive vs SharedPreferences va vs SQLite

Hive SharedPreferences va SQLite o'rtasida joyni egallaydi. SharedPreferences dan murakkabroq (maxsus obyektlarni qo'llab-quvvatlaydi), lekin SQLite dan soddaroq (SQL so'rovlarini talab qilmaydi). Asosiy xususiyatlarni solishtiramiz.

XususiyatHiveSharedPreferencesSQLite
Ma'lumot turlariIstalgan (TypeAdapter orqali)Faqat primitivlarSQL turlari
O'qish tezligi~30 000 ops/s~5 000 ops/s~2 000 ops/s
Mahalliy kodTalab qilinmaydiTalab qilinadi (Android)Talab qilinadi
Web qo'llab-quvvatlashHaYo'qYo'q
MurakkablikPastMinimalO'rta
ReaktivlikWatchBoxYo'qORM orqali

Qachon Hive ni tanlash

Hive kichik hajmdagi ma'lumotlar uchun optimal: dastur sozlamalari, API javoblarining keshi, mahalliy sinxronizatsiya navbati, sevimlilar va ko'rish tarixi. Agar ma'lumotlar 50 MB dan oshmasa va relyatsion so'rovlar talab qilinmasa — Hive SQLite dan tezroq va soddaroq.

Qachon Hive mos kelmaydi

Hive bir nechta maydonlar bo'yicha filtrlash, JOIN, agregat funksiyalar bilan so'rovlarni qo'llab-quvvatlamaydi. Agar “bugungi barcha vazifalarni 3 dan yuqori ustuvorlik bilan tanla” kabi murakkab so'rovlar kerak bo'lsa — drift yoki floor bilan SQLite dan foydalaning. Hive shuningdek xotiraga yuklash sababli 100 MB dan ortiq ma'lumotlarni saqlash uchun mos emas.

Hive bilan kod misollari

Hive ishga tushirish va Box ni ochish bilan boshlanadi. Quyida odatiy stsenariy — Flutter ilovasida vazifalar ro'yxatini saqlash uchun asosiy operatsiyalar keltirilgan. Barcha misollar mahalliy platforma chaqiruvlarisiz ishlaydi.

Ishga tushirish va Box ni ochish

Hive dan foydalanishdan oldin main funksiyasida Hive.initFlutter() chaqirilishi kerak. Keyin Hive.openBox() orqali Box ochiladi — natija o'qish va yozish uchun tayyor Box namunasi bo'ladi.

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 operatsiyalari

Box put, get, delete metodlarini taqdim etadi va barcha yozuvlarni aylanib chiqish uchun iteratordan iborat. Kalitlar va qiymatlar generiklar orqali tiplarga ajratiladi — standart holda Box<dynamic> istalgan turlarga ruxsat beradi, lekin aniq turni ko'rsatish tavsiya etiladi.

dart
// Ma'lumotlarni yozish
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', 'Mahsulotlarni sotib olish');

// O'qish
final task = box.get('task_1');

// Barcha kalitlar
final allTasks = box.values.toList();

// O'chirish
await box.delete('task_1');

// Box ni tozalash
await box.clear();

WatchBox orqali reaktiv kuzatish

WatchBox — obunachilarni o'zgarishlar haqida xabardor qiladigan Box kengaytmasi. Flutter da bu ValueListenableBuilder bilan integratsiyalanadi: Box dagi har qanday qiymat o'zgarganda, vidjet setState chaqirmasdan avtomatik ravishda qayta quriladi.

dart
final watchBox = await Hive.openBox('settings');

// Vidjetda
ValueListenableBuilder(
    valueListenable: watchBox.listenable(),
    builder: (context, box, _) {
        final counter = box.get('counter') ?? 0;
        return Text('Hisoblagich: $counter');
    },
)

TypeAdapter va maxsus obyektlar

TypeAdapter — Hive ning maxsus Dart obyektlarini serializatsiya qilish mexanizmi. Adapter obyektni ikkilik formatga (write) va orqaga (read) qanday aylantirishni tavsiflaydi. json_serializable dan farqli o'laroq, TypeAdapter refleksiyani talab qilmaydi va tezroq ishlaydi.

TypeAdapter yaratish

Adapter ikkita metodga ega TypeAdapter interfeysini amalga oshiradi: read va write. Sinf Box ochilishidan oldin Hive.registerAdapter() orqali ro'yxatdan o'tkaziladi. Har bir adapterga raqamli ID beriladi — turni identifikatsiya qilish uchun faylda saqlanadi.

dart
// Ma'lumotlar 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 generatsiyasi orqali adapterlarni yaratish

Ko'p sonli modellari bo'lgan loyihalar uchun Hive hive_generator va build_runner ni taqdim etadi. Sinfda @HiveType annotatsiyasi va maydonlarda @HiveField adapterni avtomatik ravishda yaratadi. Bu model 10+ maydondan iborat bo'lganda qulay — qo'lda read/write yozish mashaqqatli bo'ladi.

Hive unumdorligini optimallashtirish

Hive o'qishni diskdan emas, balki xotiradan amalga oshiradi, bu sekundiga 30 000 operatsiyagacha tezlikni beradi. Optimallashtirish uchun: Box ni bir marta oching va butun ilova davomida qayta foydalaning, openBox ni qayta chaqirmang. Ishga tushirishdan so'ng Hive.box() (sinxron getter) dan foydalaning — yangi namuna yaratmasdan allaqachon ochilgan Box ni qaytaradi.

Hive Provider va Riverpod bilan birgalikda

Hive mashhur Flutter state menejerlari bilan oson integratsiyalanadi. Provider uchun ishga tushirishda Box dan ma'lumotlarni o'qiydigan va listenable orqali yangilanadigan ChangeNotifierProvider dan foydalaning. Riverpod uchun WatchBox ga obuna bo'lgan StreamProvider mos keladi. Bunday kombinatsiya setState ni qo'lda chaqirmasdan Hive dagi har bir ma'lumot o'zgarishida UI ni reaktiv yangilashni ta'minlaydi. Oddiy Flutter loyihasida bunday arxitektura global singletonsiz ekranlar o'rtasida holatni sinxronlashtirishga imkon beradi.

Tez-tez beriladigan savollar

Hive ni Fluttersiz ishlatish mumkinmi?

Hive sof Dart da ishlaydi, shuning uchun uni har qanday Dart loyihasida ishlatish mumkin: server (Dart VM), konsol yoki AngularDart. Flutter uchun qo'shimcha ravishda saqlash yo'llarini ishga tushirish bilan hive_flutter ulanadi.

Hive da ma'lumotlarni qanday shifrlash mumkin?

Hive Box ochilganda encryptionKey parametri orqali AES-256 shifrlashni qo'llab-quvvatlaydi. Kalit 32 baytli satr bo'lishi kerak. Shifrlangan Box kalitsiz o'qib bo'lmaydi — ma'lumotlar fayl darajasida himoyalangan.

Hive Isar dan nimasi bilan farq qiladi?

Isar — xuddi shu muallifdan (Simon Leiter) Hive ning vorisi. Isar tezroq, indekslar, munosabatlar va murakkab so'rovlarni qo'llab-quvvatlaydi. Biroq, Hive Isar ning relyatsion imkoniyatlari kerak bo'lmagan oddiy stsenariylar va minimal bog'liqlik muhim bo'lgan loyihalar uchun dolzarb bo'lib qolmoqda.

Hive sxema migratsiyasini qo'llab-quvvatlaydimi?

Hive o'rnatilgan migratsiyalarga ega emas. Agar TypeAdapter strukturasi o'zgargan bo'lsa, eski ma'lumotlar deserializatsiya qilinmaydi. Yechim: adapterning typeId sini oshiring va kodda qo'lda migratsiya yozing yoki yangi kalitni yozishdan oldin eski kalit uchun delete dan foydalaning.

Hive Box ning maksimal hajmi qancha?

Hive Box ni to'liq xotiraga yuklaydi. Tavsiya etilgan limit bitta Box uchun 50-100 MB. Oshib ketganda Box ni ochishda kechikishlar va RAM iste'moli ortishi mumkin. Kattaroq hajmlar uchun bir nechta Box yoki kechiktirib yuklash bilan LazyBox dan foydalaning.

Xulosa

  • Hive — sof Dart da NoSQL ma'lumotlar bazasi, mahalliy kod va platforma bog'liqliklarisiz
  • Tezlik — mobil qurilmalarda sekundiga 30 000 o'qish operatsiyasigacha
  • TypeAdapter — refleksiyasiz maxsus obyektlarning ikkilik serializatsiyasi
  • WatchBox — UI ni avtomatik yangilash uchun o'zgarishlarni reaktiv kuzatish
  • Ko'p platformalilik — Android, iOS, Web, macOS, Windows, Linux qutidan chiqqanday
  • Shifrlash — Box fayli darajasida AES-256 ma'lumotlarni himoya qilish
  • Tavsiya — Flutter va Dart loyihalarida keshlash, sozlamalar va kichik hajmli ma'lumotlar uchun Hive dan foydalaning

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing