ToB企服应用市场:ToB评测及商务社交产业平台

标题: Flutter Hive NoSql 数据库利用指南 [打印本页]

作者: 圆咕噜咕噜    时间: 2024-8-14 12:44
标题: Flutter Hive NoSql 数据库利用指南
Flutter Hive NoSql 数据库利用指南


视频

https://www.bilibili.com/video/BV1yJ4m1u7P2/
https://youtu.be/UJobRKdp68k
前言

   原文 https://ducafecat.com/blog/flutter-hive-nosql-guide
  

本文将会写一个 Hive CURD 的例子,详细先容 Hive 这个轻量级的 Flutter 离线数据库的利用方法,包括 Hive 在 Flutter 开辟中的重要性、Hive 与 SQLite 的比力等,帮助开辟者快速上手 Hive 数据库。
Flutter, Hive, NoSql, 离线数据库, 键值对数据库, 跨平台开辟
参考

https://docs.hivedb.dev/#/
https://pub.dev/packages/hive
Hive

Hive 是一个 nosql 的离线数据库,在 Flutter 开辟中具有重要的作用。以下是 Hive 在 Flutter 开辟中的一些重要性:

Hive 与 SQLite 比力


Hive 与 shared_preferences 比力


​ - Hive: 适合大量结构化数据,如用户信息、应用步伐设置和游戏数据。
​ - Shared Preferences: 适合少量简单数据,如用户偏好、令牌和标记。
实现步调

第一步:初始

包依赖 pubspec.yaml
  1. dependencies:
  2.   hive: 2.2.3
  3.   hive_flutter: 1.1.0
复制代码
初始 hive 对象 lib/main.dart
  1. Future<void> main() async {
  2.   await Hive.initFlutter();
  3.   runApp(const MyApp());
  4. }
复制代码
第二步:新增

lib/utils.dart
工具类,模拟数据用
  1. import 'dart:math';
  2. // 随机字符串函数
  3. String generateRandomString() {
  4.   final rnd = Random.secure();
  5.   final length = 8 + rnd.nextInt(5); // 生成 8 到 12 位之间的随机长度
  6.   const chars =
  7.       'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
  8.   return String.fromCharCodes(
  9.     Iterable.generate(
  10.       length,
  11.       (_) => chars.codeUnitAt(rnd.nextInt(chars.length)),
  12.     ),
  13.   );
  14. }
复制代码
  1. // 随机编号函数
  2. String generateRandomNumberString() {
  3.   final rnd = Random.secure();
  4.   final prefix = rnd.nextInt(90) + 10; // 生成 10 到 99 之间的前缀
  5.   final suffix = rnd.nextInt(9000) + 1000; // 生成 1000 到 9999 之间的后缀
  6.   return '$prefix$suffix';
  7. }
复制代码
lib/page.dart
成员变量
  1.   // hive 集合对象
  2.   late Box msgBox;
  3.   // 消息列表
  4.   var _msgList = [];
复制代码
载入全部数据
  1.   // 读取数据
  2.   void _loadData() {
  3.     // 倒序
  4.     _msgList = msgBox.values.toList().reversed.toList();
  5.     if (mounted) {
  6.       setState(() {});
  7.     }
  8.   }
复制代码
初始
  1.   // 初始化
  2.   Future<void> _init() async {
  3.     msgBox = await Hive.openBox('msgBox');
  4.     _loadData();
  5.   }
复制代码
  1.   @override
  2.   void initState() {
  3.     super.initState();
  4.     _init();
  5.   }
复制代码
模拟一条数据
  1.   // 模拟接收到一条消息
  2.   Map _recvMsg() {
  3.     var newMsg = {
  4.       "message_id": DateTime.now().millisecondsSinceEpoch.toString(),
  5.       "sender": {
  6.         "user_id": "user${generateRandomNumberString()}",
  7.         "username": generateRandomString(),
  8.         "avatar_url": "https://example.com/avatar.jpg"
  9.       },
  10.       "receiver": {
  11.         "user_id": "user002",
  12.         "username": "Bob",
  13.         "avatar_url": "https://example.com/avatar2.jpg"
  14.       },
  15.       "content": "Hello, how are you?",
  16.       "timestamp": "2023-06-24T10:30:00Z",
  17.       "type": "text",
  18.       "status": "sent",
  19.       "read": false
  20.     };
  21.     return newMsg;
  22.   }
复制代码
按钮组:新增、全部
  1.   Widget _buildBtns() {
  2.     return Row(
  3.       mainAxisAlignment: MainAxisAlignment.center,
  4.       children: <Widget>[
  5.         // 新增
  6.         ElevatedButton(
  7.           onPressed: () {
  8.             var msg = _recvMsg();
  9.             msgBox.put(msg["message_id"], msg);
  10.             _loadData();
  11.           },
  12.           child: const Text("新增"),
  13.         ),
  14.         const SizedBox(width: 10),
  15.         
  16.         // 所有
  17.         ElevatedButton(
  18.           onPressed: () {
  19.             _loadData();
  20.           },
  21.           child: const Text("所有"),
  22.         ),
  23.       ],
  24.     );
  25.   }
复制代码
构建列表
  1.   Widget _buildList() {
  2.     return ListView.builder(
  3.       itemCount: _msgList.length,
  4.       itemBuilder: (context, index) {
  5.         var msg = _msgList[index];
  6.         return ListTile(
  7.           title: Text(msg["sender"]["user_id"]),
  8.           subtitle: Text(msg["sender"]["username"]),
  9.         );
  10.       },
  11.     );
  12.   }
复制代码
主视图
  1.   Widget _mainView() {
  2.     return Center(
  3.       child: Column(
  4.         mainAxisAlignment: MainAxisAlignment.center,
  5.         children: <Widget>[
  6.           // 按钮
  7.           _buildBtns(),
  8.           // 记录数
  9.           Text("记录数: ${_msgList.length}"),
  10.           // 列表
  11.           Expanded(child: _buildList()),
  12.         ],
  13.       ),
  14.     );
  15.   }
复制代码
  1.   @override
  2.   Widget build(BuildContext context) {
  3.     return Scaffold(
  4.       appBar: AppBar(
  5.         title: const Text('Hive Page'),
  6.       ),
  7.       body: _mainView(),
  8.     );
  9.   }
复制代码
第三步:删除

lib/page.dart
  1.   Widget _buildList() {
  2.     return ListView.builder(
  3.       itemCount: _msgList.length,
  4.       itemBuilder: (context, index) {
  5.         var msg = _msgList[index];
  6.         return ListTile(
  7.           title: Text(msg["sender"]["user_id"]),
  8.           subtitle: Text(msg["sender"]["username"]),
  9.           // 删除按钮
  10.           trailing: IconButton(
  11.             icon: const Icon(Icons.delete),
  12.             onPressed: () {
  13.               msgBox.delete(msg["message_id"]);
  14.               _loadData();
  15.             },
  16.           ),
  17.         );
  18.       },
  19.     );
  20.   }
复制代码
最后:查询

lib/page.dart
  1.   Widget _buildBtns() {
  2.     return Row(
  3.       mainAxisAlignment: MainAxisAlignment.center,
  4.       children: <Widget>[
  5.         // 新增
  6.         ElevatedButton(
  7.           onPressed: () {
  8.             var msg = _recvMsg();
  9.             msgBox.put(msg["message_id"], msg);
  10.             _loadData();
  11.           },
  12.           child: const Text("新增"),
  13.         ),
  14.         const SizedBox(width: 10),
  15.         // 查询
  16.         ElevatedButton(
  17.           onPressed: () {
  18.             // 查询 user_id 中含有 8 的用户
  19.             _msgList = msgBox.values
  20.                 .where((element) =>
  21.                     element["sender"]["user_id"]?.indexOf("8") != -1)
  22.                 .toList();
  23.             setState(() {});
  24.           },
  25.           child: const Text("包含 8 字符"),
  26.         ),
  27.         const SizedBox(width: 10),
  28.         // 所有
  29.         ElevatedButton(
  30.           onPressed: () {
  31.             _loadData();
  32.           },
  33.           child: const Text("所有"),
  34.         ),
  35.       ],
  36.     );
  37.   }
复制代码
代码

https://github.com/ducafecat/flutter_develop_tips/tree/main/flutter_application_hive
小结

Hive 作为一个轻量级、高性能的 NoSQL 数据库,非常适合在 Flutter 应用中用作离线数据存储。相比传统的 SQLite 数据库,Hive 在读写性能、跨平台支持、API 简单易用等方面都有明显的上风。开辟者可以通过学习本文先容的 Hive 利用指南,快速将 Hive 数据库集成到 Flutter 项目中,为应用提供稳定的离线数据支持,提升用户体验。
感谢阅读本文
如果有什么建议,请在评论中让我知道。我很乐意改进。

flutter 学习路径



© 猫哥
ducafecat.com
end

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4