Hive 在 Flutter 中的使用

前言

官方原话:Hive是为Flutter设计的。如果您需要一个轻量级的数据存储来支持您的应用,它非常合适。添加所需的依赖并初始化Hive后,您就可以在项目中使用Hive了

Hive 是一款用纯 Dart 编写的轻量级且极速的键值数据库,其灵感来源于 Bitcask。

其实简单的来说,上手简单

特点

  • 跨平台:移动、桌面、浏览器
  • ⚡ 性能卓越(参见基准测试)
  • ❤️ 简单、强大、直观的应用程序接口
  • 内置强大的加密功能
  • 无本地依赖性

使用

第一步,先引入库

dependencies: 
  hive: ^2.2.3
  hive_flutter: ^1.1.0

dev_dependencies: 
  hive_generator: 2.0.1
  build_runner: 2.4.8 

接下来在main 里初始化

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();
  Hive.registerAdapter(ContactAdapter());//实体方式保存
  await Hive.openBox(userBox);//直接键对值保存
  runApp(const MyApp());
}

疑问一:ContactAdapter 这个怎么来的呢? 先看图

在这里插入图片描述

我们在目录(这里为了测试,放在根目录了,建议是放置在数据目录)新建contact_page.dart

import 'package:hive/hive.dart';

part 'contact_page.g.dart';//一定要注意,跟实体名称一致

@HiveType(typeId: 0)
class Contact extends HiveObject {
  @HiveField(0)
  final String name;
  @HiveField(1)
  final int age;

  Contact({required this.name,required this.age});
}

接下来我们在命令窗口执行这串命令,会自动生成文件

flutter packages pub run build_runner build --delete-conflicting-outputs

在这里插入图片描述

下面为主页demo的完整代码

const String userBox = “user_box”; //临时键值存储表
const String contactBox = “contact_box”; //实体数据表
class MyHomePage extends StatefulWidget {
const MyHomePage({
super.key,
});

@override
State createState() => _MyHomePageState();
}

class _MyHomePageState extends State {
final _shoppingBox = Hive.box(userBox);

int _counter = 0;
List contractLis = [];

void _add() {
_counter++;
addData(_counter);
_shoppingBox.put(‘key’, ‘我是普通的键值’);
loadData();
}

@override
void initState() {
super.initState();
loadData();
}

Future addData(int index) async {
var box = await Hive.openBox(contactBox); // 存储数据
var user = Contact(name: ‘Johnny i n d e x ′ , a g e : i n d e x ) ; a w a i t b o x . p u t ( ′ index', age: index); await box.put(' index,age:index);awaitbox.put({DateTime.timestamp().millisecond}’, user);
}

Future loadData() async {
// 读取数据
var box = await Hive.openBox(contactBox); // 存储数据
contractLis = box.values.toList();
contractLis.sort((a, b) => b.age.compareTo(a.age));
setState(() {});
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(“demo”),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
‘简单存储’,
),
Text(
_shoppingBox.get(‘key’) ?? “暂无设置”,
),
const SizedBox(
height: 12,
),
const Text(
‘实体存储’,
),
…contractLis
.map((e) => Text(
e.name ?? “”,
))
.toList(),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _add,
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}


说明
--

final \_shoppingBox = Hive.box(userBox); 可以不用在Future 调用,非常的舒服 但是要执行 openBox操作一定需要,切记

var box = await Hive.openBox(contactBox);


首次编译成功后,本地会增加俩文件 user\_box 和 contact\_box,这俩文件是存储咋们的内容的文件

```bash
在这里插入代码片

如果你看到了这里,觉得文章写得不错就给个赞呗?
更多Android进阶指南 可以扫码 解锁更多Android进阶资料


在这里插入图片描述
敲代码不易,关注一下吧。ღ( ´・ᴗ・` )

### 如何在 Flutter 项目中使用 Hive 进行本地存储 #### 初始化 Hive 为了开始使用 Hive,在 `pubspec.yaml` 文件中添加依赖项: ```yaml dependencies: flutter: sdk: flutter hive: ^latest_version hive_flutter: ^latest_version ``` 安装完成后,初始化 Hive 并打开一个盒子(box),这一步通常放在应用程序启动的地方完成。 ```dart import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; import 'package:hive_flutter/hive_flutter.dart'; void main() async { await Hive.initFlutter(); // 初始化 Hive var box = await Hive.openBox('myBox'); // 打开名为 myBox 的盒子 runApp(MyApp()); } ``` #### 存储简单数据类型 对于基本的数据类型如字符串、整数等可以直接存入和取出而无需额外配置[^1]。 ```dart // 将值放入盒子 await box.put('name', 'John Doe'); // 获取盒子中的值 String name = box.get('name'); print(name); // 输出 John Doe ``` #### 定义自定义对象及其适配器 当涉及到复杂对象时,则需创建相应的序列化逻辑。通过给定的类加上特定注解来辅助生成适配器代码[^4]。 假设有一个表示用户的类 User: ```dart part 'user.g.dart'; // 声明部分文件 @HiveType(typeId: 0) // 设置 type ID class User extends HiveObject { @HiveField(0) String? username; @HiveField(1) int age; } // 需要在命令行执行此指令来自动生成 user.g.dart 文件内的适配器代码: // flutter packages pub run build_runner build ``` 接着注册新类型的适配器以便能够在 Boxes 中保存此类实例[^3]: ```dart WidgetsFlutterBinding.ensureInitialized(); await Hive.initFlutter(); if (!Hive.isAdapterRegistered(UserAdapter().typeId)) { Hive.registerAdapter(UserAdapter()); // 注册适配器 } var usersBox = await Hive.openBox<User>('users'); User newUser = User() ..username = "Alice" ..age = 28; await usersBox.add(newUser); ``` 以上展示了如何利用 Hive 来处理简单的键值对以及更复杂的结构化数据模型。由于其高效性和易用性,使得它成为了很多开发者首选的小型嵌入式数据库解决方案之一[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值