Flutter Hive NoSql 数据库利用指南

打印 上一主题 下一主题

主题 679|帖子 679|积分 2037

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 提供了一个高性能的键值对数据库,可以在用户设备上存储大量的离线数据。这对于必要离线利用的应用步伐非常有用,例如社交应用、阅读应用等。
  • 快速读写: Hive 基于 Dart 的二进制序列化,读写速度非常快。这对于必要频繁读写数据的应用步伐来说非常重要,可以进步用户体验。
  • 跨平台支持: Hive 同时支持 Android 和 iOS 平台,可以在差别操作体系上无缝利用,大大降低了跨平台开辟的成本。
  • 简单易用: Hive 的 API 设计得非常简洁明白,上手容易,可以快速集成到 Flutter 项目中。
  • 数据安全: Hive 提供了数据加密功能,可以保护用户的隐私数据安全。
  • 与 Flutter 集成精良: Hive 与 Flutter 集成非常好,可以完美地与 Flutter 的状态管理等其他功能配合利用。
Hive 与 SQLite 比力



  • 数据存储方式:

    • Hive: Hive 是一个基于 Key-Value 的 NoSQL 数据库,数据以二进制形式存储在当地文件中。
    • SQLite: SQLite 是一个基于 SQL 语言的关系型数据库,数据以表格形式存储在当地数据库文件中。

  • 查询方式:

    • Hive: Hive 采用类似 Map 的 API 举行数据的增删改查,好比 get(), put(), delete()等。
    • SQLite: SQLite 采用 SQL 语言举行数据的增删改查,好比 SELECT, INSERT, UPDATE, DELETE等。

  • 性能:

    • Hive: Hive 的读写性能广泛优于 SQLite,因为 Hive 的数据操作更加简单高效。
    • SQLite: SQLite 在处理复杂的查询和关联操作时,性能可能会略优于 Hive。

  • 查询复杂度:

    • Hive: Hive 的查询相对简单,更适合一些根本的数据存储和访问需求。
    • SQLite: SQLite 支持复杂的 SQL 查询,可以处理更加复杂的数据关系和业务需求。

  • 数据库结构:

    • Hive: Hive 的数据结构相对简单,主要是 Key-Value 形式。
    • SQLite: SQLite 支持更加复杂的数据库结构,包括表、索引、视图等。

  • 数据类型:

    • Hive: Hive 支持根本的数据类型,好比 int、string、bool等。
    • SQLite: SQLite 支持更丰富的数据类型,包括 int、float、text、blob等。

Hive 与 shared_preferences 比力



  • Hive

    • NoSQL 数据库
    • 快速高效
    • 支持加密
    • 将数据存储在箱中(类似于表)
    • 支持事务
    • 有更大的存储容量

  • 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 学习路径



  • Flutter 精良插件推荐 https://flutter.ducafecat.com
  • Flutter 基础篇1 - Dart 语言学习 https://ducafecat.com/course/dart-learn
  • Flutter 基础篇2 - 快速上手 https://ducafecat.com/course/flutter-quickstart-learn
  • Flutter 实战1 - Getx Woo 电商APP https://ducafecat.com/course/flutter-woo
  • Flutter 实战2 - 上架指南 Apple Store、Google Play https://ducafecat.com/course/flutter-upload-apple-google
  • Flutter 基础篇3 - 仿微信朋友圈 https://ducafecat.com/course/flutter-wechat
  • Flutter 实战3 - 腾讯即时通讯 第一篇 https://ducafecat.com/course/flutter-tim
  • Flutter 实战4 - 腾讯即时通讯 第二篇 https://ducafecat.com/course/flutter-tim-s2

© 猫哥
ducafecat.com
end

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表