Flutter Hive NoSql 數(shù)據(jù)庫使用指南
視頻
https://www.bilibili.com/video/BV1yJ4m1u7P2/
前言
本文將會寫一個 Hive CURD 的例子蜗侈,詳細介紹 Hive 這個輕量級的 Flutter 離線數(shù)據(jù)庫的使用方法,包括 Hive 在 Flutter 開發(fā)中的重要性奖地、Hive 與 SQLite 的比較等,幫助開發(fā)者快速上手 Hive 數(shù)據(jù)庫蒋譬。
Flutter, Hive, NoSql, 離線數(shù)據(jù)庫, 鍵值對數(shù)據(jù)庫, 跨平臺開發(fā)
參考
Hive
Hive 是一個 nosql 的離線數(shù)據(jù)庫颂翼,在 Flutter 開發(fā)中具有重要的作用柏肪。以下是 Hive 在 Flutter 開發(fā)中的一些重要性:
離線數(shù)據(jù)存儲: Hive 提供了一個高性能的鍵值對數(shù)據(jù)庫,可以在用戶設備上存儲大量的離線數(shù)據(jù)。這對于需要離線使用的應用程序非常有用,例如社交應用岭洲、閱讀應用等苦始。
快速讀寫: Hive 基于 Dart 的二進制序列化,讀寫速度非程兀快。這對于需要頻繁讀寫數(shù)據(jù)的應用程序來說非常重要,可以提高用戶體驗吭净。
跨平臺支持: Hive 同時支持 Android 和 iOS 平臺,可以在不同操作系統(tǒng)上無縫使用,大大降低了跨平臺開發(fā)的成本睡汹。
簡單易用: Hive 的 API 設計得非常簡潔明了,上手容易,可以快速集成到 Flutter 項目中。
數(shù)據(jù)安全: Hive 提供了數(shù)據(jù)加密功能,可以保護用戶的隱私數(shù)據(jù)安全寂殉。
與 Flutter 集成良好: Hive 與 Flutter 集成非常好,可以完美地與 Flutter 的狀態(tài)管理等其他功能配合使用囚巴。
Hive 與 SQLite 比較
- 數(shù)據(jù)存儲方式:
- Hive: Hive 是一個基于 Key-Value 的 NoSQL 數(shù)據(jù)庫,數(shù)據(jù)以二進制形式存儲在本地文件中。
- SQLite: SQLite 是一個基于 SQL 語言的關系型數(shù)據(jù)庫,數(shù)據(jù)以表格形式存儲在本地數(shù)據(jù)庫文件中友扰。
- 查詢方式:
- Hive: Hive 采用類似 Map 的 API 進行數(shù)據(jù)的增刪改查,比如 get(), put(), delete()等彤叉。
- SQLite: SQLite 采用 SQL 語言進行數(shù)據(jù)的增刪改查,比如 SELECT, INSERT, UPDATE, DELETE等。
- 性能:
- Hive: Hive 的讀寫性能普遍優(yōu)于 SQLite,因為 Hive 的數(shù)據(jù)操作更加簡單高效村怪。
- SQLite: SQLite 在處理復雜的查詢和關聯(lián)操作時,性能可能會略優(yōu)于 Hive秽浇。
- 查詢復雜度:
- Hive: Hive 的查詢相對簡單,更適合一些基本的數(shù)據(jù)存儲和訪問需求。
- SQLite: SQLite 支持復雜的 SQL 查詢,可以處理更加復雜的數(shù)據(jù)關系和業(yè)務需求甚负。
- 數(shù)據(jù)庫結構:
- Hive: Hive 的數(shù)據(jù)結構相對簡單,主要是 Key-Value 形式柬焕。
- SQLite: SQLite 支持更加復雜的數(shù)據(jù)庫結構,包括表、索引梭域、視圖等击喂。
- 數(shù)據(jù)類型:
- Hive: Hive 支持基本的數(shù)據(jù)類型,比如 int、string碰辅、bool等。
- SQLite: SQLite 支持更豐富的數(shù)據(jù)類型,包括 int介时、float没宾、text、blob等沸柔。
Hive 與 shared_preferences 比較
-
Hive
NoSQL 數(shù)據(jù)庫
快速高效
支持加密
將數(shù)據(jù)存儲在箱中(類似于表)
支持事務
有更大的存儲容量
-
Shared Preferences
鍵值存儲
簡單易用
將數(shù)據(jù)存儲在映射中(鍵值對)
不支持事務
存儲容量有限
-
使用場景:
Hive: 適合大量結構化數(shù)據(jù)循衰,如用戶信息、應用程序設置和游戲數(shù)據(jù)褐澎。
Shared Preferences: 適合少量簡單數(shù)據(jù)会钝,如用戶偏好、令牌和標志工三。
實現(xiàn)步驟
第一步:初始
包依賴 pubspec.yaml
dependencies:
hive: 2.2.3
hive_flutter: 1.1.0
初始 hive 對象 lib/main.dart
Future<void> main() async {
await Hive.initFlutter();
runApp(const MyApp());
}
第二步:新增
lib/utils.dart
工具類迁酸,模擬數(shù)據(jù)用
import 'dart:math';
// 隨機字符串函數(shù)
String generateRandomString() {
final rnd = Random.secure();
final length = 8 + rnd.nextInt(5); // 生成 8 到 12 位之間的隨機長度
const chars =
'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
return String.fromCharCodes(
Iterable.generate(
length,
(_) => chars.codeUnitAt(rnd.nextInt(chars.length)),
),
);
}
// 隨機編號函數(shù)
String generateRandomNumberString() {
final rnd = Random.secure();
final prefix = rnd.nextInt(90) + 10; // 生成 10 到 99 之間的前綴
final suffix = rnd.nextInt(9000) + 1000; // 生成 1000 到 9999 之間的后綴
return '$prefix$suffix';
}
lib/page.dart
成員變量
// hive 集合對象
late Box msgBox;
// 消息列表
var _msgList = [];
載入所有數(shù)據(jù)
// 讀取數(shù)據(jù)
void _loadData() {
// 倒序
_msgList = msgBox.values.toList().reversed.toList();
if (mounted) {
setState(() {});
}
}
初始
// 初始化
Future<void> _init() async {
msgBox = await Hive.openBox('msgBox');
_loadData();
}
@override
void initState() {
super.initState();
_init();
}
模擬一條數(shù)據(jù)
// 模擬接收到一條消息
Map _recvMsg() {
var newMsg = {
"message_id": DateTime.now().millisecondsSinceEpoch.toString(),
"sender": {
"user_id": "user${generateRandomNumberString()}",
"username": generateRandomString(),
"avatar_url": "https://example.com/avatar.jpg"
},
"receiver": {
"user_id": "user002",
"username": "Bob",
"avatar_url": "https://example.com/avatar2.jpg"
},
"content": "Hello, how are you?",
"timestamp": "2023-06-24T10:30:00Z",
"type": "text",
"status": "sent",
"read": false
};
return newMsg;
}
按鈕組:新增、所有
Widget _buildBtns() {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// 新增
ElevatedButton(
onPressed: () {
var msg = _recvMsg();
msgBox.put(msg["message_id"], msg);
_loadData();
},
child: const Text("新增"),
),
const SizedBox(width: 10),
// 所有
ElevatedButton(
onPressed: () {
_loadData();
},
child: const Text("所有"),
),
],
);
}
構建列表
Widget _buildList() {
return ListView.builder(
itemCount: _msgList.length,
itemBuilder: (context, index) {
var msg = _msgList[index];
return ListTile(
title: Text(msg["sender"]["user_id"]),
subtitle: Text(msg["sender"]["username"]),
);
},
);
}
主視圖
Widget _mainView() {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// 按鈕
_buildBtns(),
// 記錄數(shù)
Text("記錄數(shù): ${_msgList.length}"),
// 列表
Expanded(child: _buildList()),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Hive Page'),
),
body: _mainView(),
);
}
第三步:刪除
lib/page.dart
Widget _buildList() {
return ListView.builder(
itemCount: _msgList.length,
itemBuilder: (context, index) {
var msg = _msgList[index];
return ListTile(
title: Text(msg["sender"]["user_id"]),
subtitle: Text(msg["sender"]["username"]),
// 刪除按鈕
trailing: IconButton(
icon: const Icon(Icons.delete),
onPressed: () {
msgBox.delete(msg["message_id"]);
_loadData();
},
),
);
},
);
}
最后:查詢
lib/page.dart
Widget _buildBtns() {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// 新增
ElevatedButton(
onPressed: () {
var msg = _recvMsg();
msgBox.put(msg["message_id"], msg);
_loadData();
},
child: const Text("新增"),
),
const SizedBox(width: 10),
// 查詢
ElevatedButton(
onPressed: () {
// 查詢 user_id 中含有 8 的用戶
_msgList = msgBox.values
.where((element) =>
element["sender"]["user_id"]?.indexOf("8") != -1)
.toList();
setState(() {});
},
child: const Text("包含 8 字符"),
),
const SizedBox(width: 10),
// 所有
ElevatedButton(
onPressed: () {
_loadData();
},
child: const Text("所有"),
),
],
);
}
代碼
https://github.com/ducafecat/flutter_develop_tips/tree/main/flutter_application_hive
小結
Hive 作為一個輕量級俭正、高性能的 NoSQL 數(shù)據(jù)庫,非常適合在 Flutter 應用中用作離線數(shù)據(jù)存儲奸鬓。相比傳統(tǒng)的 SQLite 數(shù)據(jù)庫,Hive 在讀寫性能、跨平臺支持掸读、API 簡單易用等方面都有明顯的優(yōu)勢串远。開發(fā)者可以通過學習本文介紹的 Hive 使用指南,快速將 Hive 數(shù)據(jù)庫集成到 Flutter 項目中,為應用提供穩(wěn)定的離線數(shù)據(jù)支持,提升用戶體驗宏多。
感謝閱讀本文
如果有什么建議,請在評論中讓我知道澡罚。我很樂意改進伸但。
flutter 學習路徑
- Flutter 優(yōu)秀插件推薦 https://flutter.ducafecat.com
- Flutter 基礎篇1 - Dart 語言學習 https://ducafecat.com/course/dart-learn
- Flutter 基礎篇2 - 快速上手 https://ducafecat.com/course/flutter-quickstart-learn
- Flutter 實戰(zhàn)1 - Getx Woo 電商APP https://ducafecat.com/course/flutter-woo
- Flutter 實戰(zhàn)2 - 上架指南 Apple Store、Google Play https://ducafecat.com/course/flutter-upload-apple-google
- Flutter 基礎篇3 - 仿微信朋友圈 https://ducafecat.com/course/flutter-wechat
- Flutter 實戰(zhàn)3 - 騰訊即時通訊 第一篇 https://ducafecat.com/course/flutter-tim
- Flutter 實戰(zhàn)4 - 騰訊即時通訊 第二篇 https://ducafecat.com/course/flutter-tim-s2
? 貓哥
ducafecat.com
end