Hive 在 Flutter 中的使用

序言

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

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

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

上链接官方库地址

特点

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

使用

第一步,先引入库

yaml 复制代码
dependencies: 
  hive: ^2.2.3
  hive_flutter: ^1.1.0

dev_dependencies: 
  hive_generator: 2.0.1
  build_runner: 2.4.8 

接下来在main 里初始化

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

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

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

scala 复制代码
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});
}

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

arduino 复制代码
flutter packages pub run build_runner build --delete-conflicting-outputs

下面为主页demo的完整代码

scss 复制代码
```

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

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

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

  int _counter = 0;
  List<Contact> contractLis = [];

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

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

  Future<void> addData(int index) async {
    var box = await Hive.openBox<Contact>(contactBox); // 存储数据
    var user = Contact(name: 'Johnny $index', age: index);
    await box.put('${DateTime.timestamp().millisecond}', user);
  }

  Future<void> loadData() async {
// 读取数据
    var box = await Hive.openBox<Contact>(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: <Widget>[
            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操作一定需要,切记

ini 复制代码
  var box = await Hive.openBox<Contact>(contactBox);  

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

一起看看效果吧

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

相关推荐
c***4210几秒前
MySQL-触发器(TRIGGER)
android·数据库·mysql
有位神秘人2 分钟前
Android视频播放方案
android·音视频
U***l8326 分钟前
MySql的慢查询(慢日志)
android·mysql·adb
2501_915918416 分钟前
iOS 手机抓包软件怎么选?HTTPS 调试、TCP 数据流分析与多工具组合的完整实践
android·ios·智能手机·小程序·https·uni-app·iphone
某空m13 分钟前
【Android】组件化搭建
android·java·前端
小小8程序员14 分钟前
Android 性能调优与故障排查:ADB 诊断命令终极指南
android·adb
游戏开发爱好者825 分钟前
iOS 应用上架的工程实践复盘,从构建交付到审核通过的全流程拆解
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张29 分钟前
iOS App 如何上架,从准备到发布的完整流程方法论
android·macos·ios·小程序·uni-app·cocoa·iphone
i***279532 分钟前
MySQL-mysql zip安装包配置教程
android·mysql·adb
v***160233 分钟前
mysql的主从配置
android·mysql·adb