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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন