Flutter Hive NoSql 数据库使用指南

简介: 本文将会写一个 Hive CURD 的例子,详细介绍 Hive 这个轻量级的 Flutter 离线数据库的使用方法,包括 Hive 在 Flutter 开发中的重要性、Hive 与 SQLite 的比较等,帮助开发者快速上手 Hive 数据库。

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

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

工具类,模拟数据用

import 'dart:math';

// 随机字符串函数
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)),
    ),
  );
}
// 随机编号函数
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 = [];

载入所有数据

  // 读取数据
  void _loadData() {
   
   
    // 倒序
    _msgList = msgBox.values.toList().reversed.toList();
    if (mounted) {
   
   
      setState(() {
   
   });
    }
  }

初始

  // 初始化
  Future<void> _init() async {
   
   
    msgBox = await Hive.openBox('msgBox');
    _loadData();
  }
  
  void initState() {
   
   
    super.initState();
    _init();
  }

模拟一条数据

  // 模拟接收到一条消息
  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(),

          // 记录数
          Text("记录数: ${_msgList.length}"),

          // 列表
          Expanded(child: _buildList()),
        ],
      ),
    );
  }
  
  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 数据库,非常适合在 Flutter 应用中用作离线数据存储。相比传统的 SQLite 数据库,Hive 在读写性能、跨平台支持、API 简单易用等方面都有明显的优势。开发者可以通过学习本文介绍的 Hive 使用指南,快速将 Hive 数据库集成到 Flutter 项目中,为应用提供稳定的离线数据支持,提升用户体验。

感谢阅读本文

如果有什么建议,请在评论中让我知道。我很乐意改进。


flutter 学习路径


© 猫哥
ducafecat.com

end

相关文章
|
20天前
|
SQL 存储 NoSQL
Redis6入门到实战------ 一、NoSQL数据库简介
这篇文章是关于NoSQL数据库的简介,讨论了技术发展、NoSQL数据库的概念、适用场景、不适用场景,以及常见的非关系型数据库。文章还提到了Web1.0到Web2.0时代的技术演进,以及解决CPU、内存和IO压力的方法,并对比了行式存储和列式存储数据库的特点。
Redis6入门到实战------ 一、NoSQL数据库简介
|
7天前
|
SQL 存储 NoSQL
从SQL到NoSQL:理解不同数据库类型的选择与应用——深入比较数据模型、扩展性、查询语言、一致性和适用场景,为数据存储提供全面决策指南
【8月更文挑战第31天】在信息技术飞速发展的今天,数据库的选择至关重要。传统的SQL数据库因其稳定的事务性和强大的查询能力被广泛应用,而NoSQL数据库则凭借其灵活性和水平扩展性受到关注。本文对比了两种数据库类型的特点,帮助开发者根据应用场景做出合理选择。SQL数据库遵循关系模型,适合处理结构化数据和复杂查询;NoSQL数据库支持多种数据模型,适用于非结构化或半结构化数据。SQL数据库在一致性方面表现优异,但扩展性较差;NoSQL数据库则设计之初便考虑了水平扩展性。SQL使用成熟的SQL语言,NoSQL的查询语言更为灵活。
15 0
|
2月前
|
存储 SQL NoSQL
NoSQL数据库与传统关系型数据库的比较
【7月更文挑战第29天】NoSQL数据库与传统关系型数据库各有其独特的优势和适用场景。关系型数据库在复杂查询、事务处理和一致性方面表现出色,但在扩展性和处理大规模数据集时可能受到限制。而NoSQL数据库则以高扩展性、高性能和高可用性为目标,适用于处理大规模数据集和高并发读写场景。在选择数据库时,开发者应根据具体的应用场景和需求进行权衡和选择。
|
2月前
|
存储 SQL NoSQL
现代数据库技术:从关系型到NoSQL的演进与比较
随着信息技术的飞速发展,数据库技术也在不断演进和创新。本文将探讨现代数据库技术的发展历程,重点比较了传统的关系型数据库和新兴的NoSQL数据库,分析它们在不同场景下的优缺点及应用推荐。
|
2月前
|
SQL NoSQL 关系型数据库
现代数据库技术:从关系型到NoSQL的进化与应用
本文探讨了现代数据库技术的发展历程,从传统的关系型数据库到新兴的NoSQL数据库的演进过程。通过比较不同类型数据库的特点和应用场景,分析它们在各自领域中的优缺点及适用性,旨在帮助读者理解并选择合适的数据库技术来支持他们的应用需求。
|
2月前
|
缓存 NoSQL Java
使用Spring Boot和Couchbase实现NoSQL数据库
使用Spring Boot和Couchbase实现NoSQL数据库
|
3月前
|
开发框架 前端开发 测试技术
Flutter开发常见问题解答
Flutter开发常见问题解答
|
4月前
|
前端开发 C++ 容器
Flutter-完整开发实战详解(一、Dart-语言和-Flutter-基础)(1)
Flutter-完整开发实战详解(一、Dart-语言和-Flutter-基础)(1)
|
14天前
|
开发框架 Android开发 iOS开发
Flutter相关痛点解决问题之淘特选择桌面端开发框架如何解决
Flutter相关痛点解决问题之淘特选择桌面端开发框架如何解决
|
26天前
|
移动开发 前端开发 JavaScript
"跨界大战!React Native、Weex、Flutter:三大混合开发王者正面交锋,揭秘谁才是你移动应用开发的终极利器?"
【8月更文挑战第12天】随着移动应用开发的需求日益增长,高效构建跨平台应用成为关键。React Native、Weex与Flutter作为主流混合开发框架各具特色。React Native依托Facebook的强大支持,以接近原生的性能和丰富的组件库著称;Weex由阿里巴巴开发,性能优越尤其在大数据处理上表现突出;Flutter则凭借Google的支持及独特的Dart语言和Skia渲染引擎,提供出色的定制能力和开发效率。选择时需考量项目特性、团队技能及生态系统的成熟度。希望本文对比能助你做出最佳决策。
61 1
下一篇
DDNS