Hive Flutter کے لیے ایک ہلکا پھلکا NoSQL اسٹوریج ہے جو مقامی کوڈ کے بغیر کام کرتا ہے۔ SQLite یا Firebase کے برعکس، Hive کو مقامی لائبریریوں کی ضرورت نہیں ہے اور یہ صرف Dart کے ذریعے کام کرتا ہے۔ Pub.dev، 2024 کے مطابق، Hive کو 10 ملین سے زیادہ بار ڈاؤن لوڈ کیا گیا ہے اور ہر تیسرے Flutter پروجیکٹ میں استعمال کیا جاتا ہے جسے سرور کے بنیادی ڈھانچے کے بغیر مقامی ڈیٹا اسٹوریج کی ضرورت ہوتی ہے۔
اہم نکات
Hive ایک NoSQL ڈیٹا بیس ہے جو مکمل طور پر Dart میں لکھا گیا ہے اور اسے کسی مقامی لائبریری کی ضرورت نہیں ہے۔ اسے Simon Leiter نے 2019 میں Flutter پروجیکٹس کے لیے SQLite کے متبادل کے طور پر بنایا تھا۔ Hive ڈیٹا کو بائنری .hive فارمیٹ میں ذخیرہ کرتا ہے جو موبائل آلات پر تیز پڑھنے اور لکھنے کے لیے بہتر بنایا گیا ہے۔ .hive فارمیٹ ایک حسب ضرورت سیریلائزیشن اسکیم استعمال کرتا ہے جہاں ہر ڈیٹا کی قسم کا اپنا بائٹ پریفکس ہوتا ہے، جو Protocol Buffers یا FlatBuffers کے برعکس، پہلے سے اسکیما معلومات کے بغیر فائل پڑھنے کی اجازت دیتا ہے۔
Hive کا بنیادی خیال زیادہ سے زیادہ سادگی ہے۔ ڈیٹا بیس کو کسی مقامی انجن کی ابتدا کی ضرورت نہیں ہے، اس میں کوئی SQL پارسر شامل نہیں ہے اور یہ ریفلیکشن استعمال نہیں کرتا ہے۔ تمام آپریشنز WriteBuffer اور ReadBuffer کے ذریعے بائنری سیریلائزیشن کے ساتھ براہ راست Dart فنکشن کالز ہیں۔
Flutter Community سروے (2023) کے مطابق، Hive Flutter میں سب سے زیادہ استعمال ہونے والے ٹاپ 5 ڈیٹا اسٹوریج پیکیجز میں شامل ہے، مقبولیت میں صرف shared_preferences کے بعد دوسرے نمبر پر ہے، لیکن فعالیت اور رفتار میں اس سے آگے ہے۔
Hive Box کے تصور کا استعمال کرتا ہے — رلیشنل ڈیٹا بیس میں ٹیبل کے مشابہ۔ ہر Box ڈسک پر ایک فائل ہے جس میں کلید-قدر کے جوڑوں کا ایک سیٹ ہوتا ہے۔ کلید int یا String ہو سکتی ہے، قدر کوئی بھی ابتدائی قسم، فہرست، Map یا TypeAdapter کے ذریعے حسب ضرورت آبجیکٹ ہو سکتی ہے۔ Boxes ایک دوسرے سے الگ تھلگ ہوتے ہیں اور آزادانہ طور پر کھولے جاتے ہیں۔
Hive کو پلیٹ فارم چینلز کی ضرورت نہیں ہے۔ اس کا مطلب ہے کہ یہ Android، iOS، Web، macOS، Windows اور Linux پر بغیر کسی اضافی ترتیب کے ایک جیسا کام کرتا ہے۔ ویب بلڈ کو نشانہ بنانے والے پروجیکٹس کے لیے، Hive واحد ہلکا پھلکا NoSQL حل ہے — SQLite براؤزر میں کام نہیں کرتا ہے۔ Hive ویب کے لیے بیک اینڈ کے طور پر IndexedDB کا استعمال کرتا ہے، جو براؤزر کے ماحول میں بھی ڈیٹا کی پائیداری کو یقینی بناتا ہے۔
Hive لکھنے پر ڈیٹا کو بائنری فارمیٹ میں سیریلائز کرتا ہے اور پڑھنے پر ڈی سیریلائز کرتا ہے۔ اندرونی طریقہ کار BinaryWriter اور BinaryReader پر مبنی ہے، جو ڈیٹا کو کمپیکٹ بائٹ صفوں میں پیک کرتے ہیں۔ ڈسک پر اسٹوریج کا سائز اوسطاً ایک ہی ڈیٹا کی JSON نمائندگی سے 2–3 گنا چھوٹا ہوتا ہے۔
Box کھولتے وقت، Hive پوری فائل کو RAM میں لوڈ کرتا ہے۔ یہ تیز پڑھنے کی رفتار (مائیکرو سیکنڈ) فراہم کرتا ہے لیکن سائز کی حد لگاتا ہے: فی Box 50–100 MB سے زیادہ ذخیرہ نہ کرنے کی سفارش کی جاتی ہے۔ بڑے حجم کے لیے، LazyBox استعمال کریں — ڈسک سے ریکارڈز کی سست لوڈنگ۔
Hive Dart آئسولیٹ کے اندر سنگل تھریڈڈ کام کرتا ہے۔ تحریری آپریشنز فائل لاکنگ کے ساتھ ہم آہنگی سے انجام پاتے ہیں۔ غیر ہم آہنگ رسائی کے لیے، await کے ساتھ Hive.openBox() استعمال کریں۔ متعدد آئسولیٹس سے بیک وقت رسائی براہ راست تعاون یافتہ نہیں ہے — اس کے لیے علیحدہ ہم آہنگی میکانزم کی ضرورت ہے۔
Hive SharedPreferences اور SQLite کے درمیان ایک جگہ رکھتا ہے۔ یہ SharedPreferences سے زیادہ پیچیدہ ہے (حسب ضرورت آبجیکٹ کو سپورٹ کرتا ہے) لیکن SQLite سے آسان ہے (SQL سوالات کی ضرورت نہیں)۔ آئیے کلیدی خصوصیات کا موازنہ کریں۔
| خصوصیت | Hive | SharedPreferences | SQLite |
|---|---|---|---|
| ڈیٹا کی اقسام | کوئی بھی (TypeAdapter کے ذریعے) | صرف ابتدائی | SQL اقسام |
| پڑھنے کی رفتار | ~30,000 ops/s | ~5,000 ops/s | ~2,000 ops/s |
| مقامی کوڈ | درکار نہیں | درکار (Android) | درکار |
| ویب سپورٹ | ہاں | نہیں | نہیں |
| پیچیدگی | کم | کم سے کم | درمیانی |
| رد عمل | WatchBox | نہیں | ORM کے ذریعے |
Hive ڈیٹا کی چھوٹی مقدار کے لیے بہترین ہے: ایپ کی ترتیبات، API جوابات کا کیش، مقامی مطابقت پذیری قطار، پسندیدہ اور براؤزنگ ہسٹری۔ اگر ڈیٹا 50 MB سے زیادہ نہ ہو اور رلیشنل سوالات کی ضرورت نہ ہو — Hive SQLite سے تیز اور آسان ہے۔
Hive متعدد فیلڈز کے ذریعے فلٹرنگ، JOIN یا ایگریگیٹ فنکشنز والے سوالات کو سپورٹ نہیں کرتا ہے۔ اگر آپ کو «آج کے لیے 3 سے زیادہ ترجیح والے تمام کام منتخب کریں» جیسے پیچیدہ سوالات کی ضرورت ہے — تو drift یا floor کے ساتھ SQLite استعمال کریں۔ Hive میموری میں لوڈ ہونے کی وجہ سے 100 MB سے زیادہ ڈیٹا ذخیرہ کرنے کے لیے بھی موزوں نہیں ہے۔
Hive ابتدا اور Box کھولنے سے شروع ہوتا ہے۔ ذیل میں ایک عام منظر نامے کے لیے بنیادی آپریشنز دیے گئے ہیں — Flutter ایپلیکیشن میں کاموں کی فہرست ذخیرہ کرنا۔ تمام مثالیں مقامی پلیٹ فارم کالز کے بغیر کام کرتی ہیں۔
Hive استعمال کرنے سے پہلے، main فنکشن میں Hive.initFlutter() کو کال کرنا ضروری ہے۔ پھر Hive.openBox() کے ذریعے Box کھولیں — نتیجہ پڑھنے اور لکھنے کے لیے تیار Box مثال ہوگا۔
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 طریقے اور تمام اندراجات کو عبور کرنے کے لیے ایک iterator فراہم کرتا ہے۔ کنجیاں اور قدریں جنرکس کے ذریعے ٹائپ کی جاتی ہیں — ڈیفالٹ طور پر Box<dynamic> کسی بھی قسم کو قبول کرتا ہے، لیکن ایک مخصوص قسم بتانے کی سفارش کی جاتی ہے۔
// ڈیٹا لکھیں
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', 'گروسری خریدیں');
// پڑھیں
final task = box.get('task_1');
// تمام کنجیاں
final allTasks = box.values.toList();
// حذف کریں
await box.delete('task_1');
// Box صاف کریں
await box.clear();
WatchBox Box کی توسیع ہے جو سبسکرائبرز کو تبدیلیوں کے بارے میں مطلع کرتی ہے۔ Flutter میں، یہ ValueListenableBuilder کے ساتھ ضم ہوتا ہے: جب Box میں کوئی بھی قدر بدلتی ہے، تو setState کال کیے بغیر widget خود بخود دوبارہ تعمیر ہو جاتا ہے۔
final watchBox = await Hive.openBox('settings');
// ویجیٹ میں
ValueListenableBuilder(
valueListenable: watchBox.listenable(),
builder: (context, box, _) {
final counter = box.get('counter') ?? 0;
return Text('کاؤنٹر: $counter');
},
)
TypeAdapter حسب ضرورت Dart آبجیکٹ کو سیریلائز کرنے کے لیے Hive کا طریقہ کار ہے۔ اڈاپٹر بیان کرتا ہے کہ آبجیکٹ کو بائنری فارمیٹ (write) میں اور واپس (read) کیسے تبدیل کیا جائے۔ json_serializable کے برعکس، TypeAdapter کو ریفلیکشن کی ضرورت نہیں ہے اور یہ تیز تر ہے۔
اڈاپٹر TypeAdapter
// ڈیٹا ماڈل
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);
}
}
بڑی تعداد میں ماڈل والے پروجیکٹس کے لیے، Hive hive_generator اور build_runner فراہم کرتا ہے۔ کلاس پر @HiveType اور فیلڈز پر @HiveField اینوٹیشن خود بخود اڈاپٹر تیار کرتے ہیں۔ یہ اس وقت آسان ہوتا ہے جب ماڈل میں 10+ فیلڈز ہوں — دستی read/write لکھنا تھکا دینے والا ہو جاتا ہے۔
Hive ڈسک کے بجائے میموری سے پڑھتا ہے، جو فی سیکنڈ 30,000 آپریشنز تک کی رفتار فراہم کرتا ہے۔ بہتری کے لیے: Box کو ایک بار کھولیں اور پوری ایپ میں اسے دوبارہ استعمال کریں، بار بار openBox کو کال نہ کریں۔ ابتدا کے بعد Hive.box() (ہم آہنگ گیٹر) استعمال کریں — یہ نیا نمونہ بنائے بغیر پہلے سے کھلا ہوا Box لوٹاتا ہے۔
Hive مشہور Flutter اسٹیٹ مینیجرز کے ساتھ آسانی سے ضم ہو جاتا ہے۔ Provider کے لیے، ChangeNotifierProvider استعمال کریں جو ابتدا پر Box سے ڈیٹا پڑھتا ہے اور listenable کے ذریعے اپ ڈیٹ ہوتا ہے۔ Riverpod کے لیے، WatchBox پر سبسکرائب کردہ StreamProvider موزوں ہے۔ یہ مجموعہ دستی setState کالز کے بغیر Hive میں ہر ڈیٹا تبدیلی پر ری ایکٹو UI اپ ڈیٹس فراہم کرتا ہے۔ ایک عام Flutter پروجیکٹ میں، یہ فن تعمیر عالمی سنگلٹن کے بغیر اسکرینوں کے درمیان حالت کو ہم آہنگ کرنے کی اجازت دیتا ہے۔
اکثر پوچھے گئے سوالات
Hive خالص Dart پر کام کرتا ہے، لہذا اسے کسی بھی Dart پروجیکٹ میں استعمال کیا جا سکتا ہے: سرور سائڈ (Dart VM)، کنسول یا AngularDart۔ Flutter کے لیے، اسٹوریج کے راستوں کی ابتدا کے لیے اضافی طور پر hive_flutter کی ضرورت ہے۔
Hive Box کھولتے وقت encryptionKey پیرامیٹر کے ذریعے AES-256 انکرپشن کو سپورٹ کرتا ہے۔ کلید 32 بائٹ کی سٹرنگ ہونی چاہیے۔ انکرپٹڈ Box کو کلید کے بغیر نہیں پڑھا جا سکتا — ڈیٹا فائل کی سطح پر محفوظ ہے۔
Isar اسی مصنف (Simon Leiter) کا Hive کا جانشین ہے۔ Isar تیز تر ہے، انڈیکس، تعلقات اور پیچیدہ سوالات کو سپورٹ کرتا ہے۔ تاہم، Hive سادہ منظرناموں کے لیے متعلقہ رہتا ہے جہاں Isar کی رلیشنل صلاحیتوں کی ضرورت نہیں ہے، اور ان پروجیکٹس کے لیے جہاں کم سے کم انحصار اہم ہے۔
Hive میں بلٹ ان مائیگریشن نہیں ہے۔ اگر TypeAdapter کا ڈھانچہ بدل جاتا ہے، تو پرانا ڈیٹا ڈی سیریلائز نہیں ہوگا۔ حل: اڈاپٹر کا typeId بڑھائیں اور کوڈ میں دستی مائیگریشن لکھیں، یا نیا لکھنے سے پہلے پرانی کلید کے لیے delete استعمال کریں۔
Hive Box کو مکمل طور پر میموری میں لوڈ کرتا ہے۔ تجویز کردہ حد فی Box 50–100 MB ہے۔ اس سے تجاوز کرنے پر Box کھولنے میں تاخیر اور RAM کی کھپت میں اضافہ ہو سکتا ہے۔ بڑے حجم کے لیے، متعدد Boxes یا سست لوڈنگ کے ساتھ LazyBox استعمال کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں