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 के माध्यम से कस्टम ऑब्जेक्ट हो सकता है। Box एक दूसरे से अलग होते हैं और स्वतंत्र रूप से खोले जाते हैं।
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 विधियाँ और सभी प्रविष्टियों को पार करने के लिए एक इटरेटर प्रदान करता है। कुंजियाँ और मान जेनेरिक के माध्यम से टाइप किए जाते हैं — डिफ़ॉल्ट रूप से 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 कॉल किए स्वचालित रूप से पुनर्निर्माण होता है।
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 की खपत बढ़ सकती है। बड़े वॉल्यूम के लिए, कई Box या लेज़ी लोडिंग के साथ LazyBox का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें