Hive คือพื้นที่จัดเก็บข้อมูล NoSQL น้ำหนักเบาสำหรับ Flutter ที่ทำงานโดยไม่ต้องใช้โค้ดเนทีฟ แตกต่างจาก SQLite หรือ Firebase ตรงที่ Hive ไม่ต้องใช้ไลบรารีเนทีฟและทำงานผ่าน Dart เท่านั้น ตามข้อมูลจาก Pub.dev, 2024 พบว่า Hive ถูกดาวน์โหลดมากกว่า 10 ล้านครั้ง และถูกใช้ในทุก ๆ หนึ่งในสามของโปรเจกต์ Flutter ที่ต้องการพื้นที่จัดเก็บข้อมูลในเครื่องโดยไม่มีโครงสร้างพื้นฐานเซิร์ฟเวอร์
ประเด็นสำคัญ
Hive คือฐานข้อมูล NoSQL ที่เขียนด้วยภาษา Dart ทั้งหมดและไม่ต้องใช้ไลบรารีเนทีฟ มันถูกสร้างโดย Simon Leiter ในปี 2019 เพื่อเป็นทางเลือกแทน SQLite สำหรับโปรเจกต์ Flutter Hive จัดเก็บข้อมูลในรูปแบบไบนารี .hive ที่ปรับให้เหมาะสมสำหรับการอ่านและเขียนที่รวดเร็วบนอุปกรณ์มือถือ รูปแบบ .hive ใช้สคีมาการทำให้เป็นอนุกรมแบบกำหนดเองซึ่งแต่ละชนิดข้อมูลมีคำนำหน้าไบต์ของตัวเอง ทำให้สามารถอ่านไฟล์ได้โดยไม่ต้องรู้สคีมาล่วงหน้า — ไม่เหมือน Protocol Buffers หรือ FlatBuffers
แนวคิดหลักของ Hive คือความเรียบง่ายสูงสุด ฐานข้อมูลไม่ต้องการการเริ่มต้นเอ็นจินเนทีฟ ไม่มีตัวแยกวิเคราะห์ SQL และไม่ใช้รีเฟลกชัน การดำเนินการทั้งหมดเป็นการเรียกฟังก์ชัน Dart โดยตรงด้วยการทำให้เป็นอนุกรมแบบไบนารีผ่าน WriteBuffer และ ReadBuffer
จากการสำรวจของ Flutter Community (2023) พบว่า Hive อยู่ใน 5 อันดับแพ็กเกจจัดเก็บข้อมูลที่ใช้มากที่สุดใน Flutter รองจาก shared_preferences ในด้านความนิยม แต่เหนือกว่าในด้านฟังก์ชันการทำงานและความเร็ว
Hive ใช้แนวคิดของ Box — เปรียบเสมือนตารางในฐานข้อมูลเชิงสัมพันธ์ แต่ละ Box คือไฟล์บนดิสก์ที่มีชุดคู่คีย์-ค่า คีย์สามารถเป็น int หรือ String ค่าสามารถเป็นชนิดพื้นฐานใด ๆ รายการ Map หรือออบเจกต์ที่กำหนดเองผ่าน TypeAdapter Box ต่าง ๆ ถูกแยกออกจากกันและเปิดอย่างอิสระ
Hive ไม่ต้องใช้ช่องสัญญาณแพลตฟอร์ม ซึ่งหมายความว่ามันทำงานเหมือนกันบน Android, iOS, Web, macOS, Windows และ Linux โดยไม่ต้องตั้งค่าเพิ่มเติม สำหรับโปรเจกต์ที่มุ่งเป้าไปที่การ build เว็บ Hive ยังคงเป็นโซลูชัน NoSQL น้ำหนักเบาเพียงหนึ่งเดียว — SQLite ไม่ทำงานในเบราว์เซอร์ Hive ใช้ IndexedDB เป็นแบ็กเอนด์สำหรับเว็บ ซึ่งรับประกันความคงทนของข้อมูลแม้ในสภาพแวดล้อมเบราว์เซอร์
Hive ทำให้ข้อมูลเป็นอนุกรมในรูปแบบไบนารีเมื่อเขียนและดีซีเรียลไลซ์เมื่ออ่าน กลไกภายในขึ้นอยู่กับ BinaryWriter และ BinaryReader ซึ่งบรรจุข้อมูลลงในอาร์เรย์ไบต์ขนาดกะทัดรัด ขนาดพื้นที่จัดเก็บในดิสก์โดยเฉลี่ยเล็กกว่าการแสดง JSON ของข้อมูลเดียวกัน 2–3 เท่า
เมื่อเปิด Box Hive จะโหลดไฟล์ทั้งหมดลงใน RAM ซึ่งให้ความเร็วในการอ่านสูง (ไมโครวินาที) แต่กำหนดข้อจำกัดด้านขนาด: แนะนำให้จัดเก็บไม่เกิน 50–100 MB ต่อ Box สำหรับปริมาณที่มากขึ้น ให้ใช้ LazyBox — การโหลดเรกคอร์ดจากดิสก์แบบขี้เกียจ
Hive ทำงานแบบเธรดเดียวภายในไอโซเลต Dart การดำเนินการเขียนจะดำเนินการแบบซิงโครนัสพร้อมการล็อกไฟล์ สำหรับการเข้าถึงแบบอะซิงโครนัส ให้ใช้ Hive.openBox() พร้อม await การเข้าถึงพร้อมกันจากหลายไอโซเลตไม่ได้รับการสนับสนุนโดยตรง — จำเป็นต้องมีกลไกการซิงโครไนซ์แยกต่างหาก
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” — ให้ใช้ SQLite กับ drift หรือ floor Hive ยังไม่เหมาะสำหรับการจัดเก็บข้อมูลมากกว่า 100 MB เนื่องจากการโหลดเข้าสู่หน่วยความจำ
Hive เริ่มต้นด้วยการเริ่มต้นและการเปิด Box ด้านล่างนี้คือการดำเนินการพื้นฐานสำหรับสถานการณ์ทั่วไป — การจัดเก็บรายการงานในแอปพลิเคชัน Flutter ตัวอย่างทั้งหมดทำงานโดยไม่ต้องเรียกแพลตฟอร์มเนทีฟ
ก่อนใช้ Hive คุณต้องเรียก Hive.initFlutter() ในฟังก์ชัน main จากนั้นเปิด Box ผ่าน Hive.openBox() — ผลลัพธ์จะเป็นอินสแตนซ์ 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 เป็นกลไกของ Hive สำหรับทำให้ออบเจกต์ Dart ที่กำหนดเองเป็นอนุกรม ตัวปรับเปลี่ยนอธิบายวิธีแปลงออบเจกต์เป็นรูปแบบไบนารี (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() (getter แบบซิงโครนัส) หลังจากการเริ่มต้น — มันคืนค่า Box ที่เปิดอยู่แล้วโดยไม่สร้างอินสแตนซ์ใหม่
Hive ผสานรวมกับตัวจัดการสถานะ Flutter ยอดนิยมได้อย่างง่ายดาย สำหรับ Provider ให้ใช้ ChangeNotifierProvider ที่อ่านข้อมูลจาก Box เมื่อเริ่มต้นและอัปเดตผ่าน listenable สำหรับ Riverpod StreamProvider ที่สมัครรับ WatchBox ทำงานได้ดี การรวมกันนี้ให้การอัปเดต UI แบบรีแอคทีฟทุกครั้งที่มีการเปลี่ยนแปลงข้อมูลใน Hive โดยไม่ต้องเรียก setState ด้วยตนเอง ในโปรเจกต์ Flutter ทั่วไป สถาปัตยกรรมนี้ช่วยให้ซิงค์สถานะระหว่างหน้าจอโดยไม่ต้องใช้ซิงเกิลตันส่วนกลาง
คำถามที่พบบ่อย
Hive ทำงานบน Dart บริสุทธิ์ ดังนั้นจึงสามารถใช้ในโปรเจกต์ Dart ใดก็ได้: ฝั่งเซิร์ฟเวอร์ (Dart VM), คอนโซล หรือ AngularDart สำหรับ Flutter จำเป็นต้องใช้ hive_flutter เพิ่มเติมสำหรับการเริ่มต้นเส้นทางจัดเก็บข้อมูล
Hive รองรับการเข้ารหัส AES-256 ผ่านพารามิเตอร์ encryptionKey เมื่อเปิด Box คีย์ต้องเป็นสตริง 32 ไบต์ Box ที่เข้ารหัสแล้วไม่สามารถอ่านได้โดยไม่มีคีย์ — ข้อมูลได้รับการปกป้องในระดับไฟล์
Isar คือผู้สืบทอดของ Hive จากผู้เขียนเดียวกัน (Simon Leiter) Isar เร็วกว่า รองรับดัชนี ความสัมพันธ์ และคำสั่งที่ซับซ้อน อย่างไรก็ตาม Hive ยังคงมีความเกี่ยวข้องสำหรับสถานการณ์ง่าย ๆ ที่ไม่ต้องการความสามารถเชิงสัมพันธ์ของ Isar และสำหรับโปรเจกต์ที่การพึ่งพาน้อยที่สุดเป็นสิ่งสำคัญ
Hive ไม่มีการย้ายสคีมาในตัว หากโครงสร้าง TypeAdapter เปลี่ยนแปลง ข้อมูลเก่าจะไม่ถูกดีซีเรียลไลซ์ วิธีแก้ไข: เพิ่ม typeId ของตัวปรับเปลี่ยนและเขียนการย้ายสคีมาด้วยตนเองในโค้ด หรือใช้ delete สำหรับคีย์เก่าก่อนเขียนคีย์ใหม่
Hive โหลด Box ทั้งหมดลงในหน่วยความจำ ขีดจำกัดที่แนะนำคือ 50–100 MB ต่อ Box การเกินกว่านี้อาจทำให้เกิดความล่าช้าเมื่อเปิด Box และการใช้ RAM เพิ่มขึ้น สำหรับปริมาณที่มากขึ้น ให้ใช้หลาย Box หรือ LazyBox พร้อมการโหลดแบบขี้เกียจ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม