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 — 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 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.
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 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.
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 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.
| Xususiyat | Hive | SharedPreferences | SQLite |
|---|---|---|---|
| Ma'lumot turlari | Istalgan (TypeAdapter orqali) | Faqat primitivlar | SQL turlari |
| O'qish tezligi | ~30 000 ops/s | ~5 000 ops/s | ~2 000 ops/s |
| Mahalliy kod | Talab qilinmaydi | Talab qilinadi (Android) | Talab qilinadi |
| Web qo'llab-quvvatlash | Ha | Yo'q | Yo'q |
| Murakkablik | Past | Minimal | O'rta |
| Reaktivlik | WatchBox | Yo'q | ORM orqali |
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.
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 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.
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.
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 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.
// 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 — 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.
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 — 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.
Adapter ikkita metodga ega TypeAdapter
// 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);
}
}
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 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 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 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 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.
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 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 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
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.