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 秒钟,对我来说是一个激励,感谢。

相关推荐
GEEKVIP1 小时前
手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
android·macos·ios·智能手机·电脑·手机·iphone
model20053 小时前
android + tflite 分类APP开发-2
android·分类·tflite
彭于晏6893 小时前
Android广播
android·java·开发语言
与衫4 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql
500了10 小时前
Kotlin基本知识
android·开发语言·kotlin
人工智能的苟富贵11 小时前
Android Debug Bridge(ADB)完全指南
android·adb
小雨cc5566ru16 小时前
uniapp+Android面向网络学习的时间管理工具软件 微信小程序
android·微信小程序·uni-app
bianshaopeng17 小时前
android 原生加载pdf
android·pdf
hhzz17 小时前
Linux Shell编程快速入门以及案例(Linux一键批量启动、停止、重启Jar包Shell脚本)
android·linux·jar
火红的小辣椒18 小时前
XSS基础
android·web安全