Flutter本地数据存储插件hive_plus的使用

Flutter本地数据存储插件hive_plus的使用

快速、愉悦且安全的NoSQL数据库

GitHub Workflow Status (branch) Codecov branch Pub Version GitHub

Hive是一个用纯Dart编写的轻量级且超快的键值数据库。灵感来源于Bitcask

文档与示例 📖

开始前 #

这是一个基于遗留版 hive (v2.2.3) 的分叉版本。我大量使用了这个hive,并发现它非常高效,所以我尝试恢复它。现在它可以支持Web端的WASM编译。

功能 #

  • 🚀 跨平台:移动设备、桌面、浏览器
  • ⚡ 极佳性能(参见 基准测试
  • ❤️ 简单、强大且直观的API
  • 🔒 强大的内置加密
  • 🎈 没有原生依赖
  • 🔋 所有必需组件都已包含

开始使用 #

请查看快速入门文档来开始使用。

使用方法 #

你可以像使用map一样使用Hive。无需等待 Futures

var box = Hive.box('myBox');

box.put('name', 'David');

var name = box.get('name');

print('Name: $name');

BoxCollections #

BoxCollections 是一组可以类似普通盒子使用的盒子,但在Web端可以显著提高速度。它们支持一次性打开和关闭集合中的所有盒子,并更有效地在IndexedDB上存储数据。

此外,它们还提供了事务,可以在Web端处理大量的数据库事务。

dart:io 平台上,BoxCollections或事务没有性能提升。只有BoxCollections可能对某些盒子层次结构和开发体验有用。

// 创建一个盒子集合
final collection = await BoxCollection.open(
  'MyFirstFluffyBox', // 数据库名称
  {'cats', 'dogs'}, // 盒子名称
  path: './', // 存储盒子的路径(仅在Flutter/Dart IO中使用)
  key: HiveCipher(), // 加密盒子的密钥(仅在Flutter/Dart IO中使用)
);

// 打开你的盒子。可选:指定类型。
final catsBox = collection.openBox<Map>('cats');

// 放入一些东西
await catsBox.put('fluffy', {'name': 'Fluffy', 'age': 4});
await catsBox.put('loki', {'name': 'Loki', 'age': 2});

// 获取类型为(不可变)Map的值
final loki = await catsBox.get('loki');
print('Loki is ${loki?['age']} years old.');

// 返回一个值列表
final cats = await catsBox.getAll(['loki', 'fluffy']);
print(cats);

// 返回一个所有键的字符串列表
final allCatKeys = await catsBox.getAllKeys();
print(allCatKeys);

// 返回一个所有键和条目的映射
final catMap = await catsBox.getAllValues();
print(catMap);

// 删除一个或多个条目
await catsBox.delete('loki');
await catsBox.deleteAll(['loki', 'fluffy']);

// 或者一次清空整个盒子
await catsBox.clear();

// 使用事务加速写操作
await collection.transaction(
  () async {
    await catsBox.put('fluffy', {'name': 'Fluffy', 'age': 4});
    await catsBox.put('loki', {'name': 'Loki', 'age': 2});
    // ...
  },
  boxNames: ['cats'], // 默认情况下,所有盒子都会被锁定。
  readOnly: false,
);

存储对象 #

Hive不仅支持基本类型、列表和映射,还可以存储任何你喜欢的Dart对象。你需要生成一个类型适配器才能存储对象。

@HiveType(typeId: 0)
class Person extends HiveObject {

  @HiveField(0)
  String name;

  @HiveField(1)
  int age;
}

继承 HiveObject 是可选的,但它提供了方便的方法,如 save()delete()

var box = await Hive.openBox('myBox');

var person = Person()
  ..name = 'Dave'
  ..age = 22;
box.add(person);

print(box.getAt(0)); // Dave - 22

person.age = 30;
person.save();

print(box.getAt(0)); // Dave - 30

Hive ❤️ Flutter #

Hive是在考虑Flutter的情况下编写的。如果你需要一个轻量级的数据存储解决方案,它非常适合你的应用。添加所需的依赖项并初始化Hive后,你可以在项目中使用Hive:

import 'package:hive_plus/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

class SettingsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder(
      valueListenable: Hive.box('settings').listenable(),
      builder: (context, box, widget) {
        return Switch(
          value: box.get('darkMode'),
          onChanged: (val) {
            box.put('darkMode', val);
          }
        );
      },
    );
  }
}

盒子被缓存,因此足够快,可以直接在Flutter小部件的 build() 方法中使用。

本地AES加密实现 #

当使用Flutter时,Hive支持使用 package:cryptographypackage:cryptography_flutter 进行本地加密。

本地AES实现极大地提高了加密盒子的操作速度。

请遵循以下步骤:

  1. 在pubspec.yaml中添加依赖项
dependencies:
  cryptography_flutter: ^2.0.2
  1. 启用本地实现
import 'package:cryptography_flutter/cryptography_flutter.dart';

void main() {
  // 启用Flutter加密
  FlutterCryptography.enable();

  // ....
}

更多关于Flutter本地数据存储插件hive_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地数据存储插件hive_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用hive_plus插件进行本地数据存储的示例代码。hive_plus是Hive的一个增强版本,提供了对Web平台的支持以及更好的性能。

首先,确保你的Flutter项目已经包含了hivehive_flutter(用于Flutter平台)以及hive_plus(如果你需要Web支持)的依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  hive: ^2.0.4  # 请检查最新版本号
  hive_flutter: ^1.1.0  # 请检查最新版本号
  hive_plus: ^3.0.0  # 如果你需要Web支持,并请检查最新版本号

然后,运行flutter pub get来获取这些依赖。

接下来,你需要初始化Hive。通常,这会在你的应用程序的入口点(例如main.dart)进行。

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:hive_plus/hive_plus.dart';  // 如果你需要Web支持
import 'package:path_provider/path_provider.dart';

void main() async {
  // 确定应用程序的本地存储目录
  final appDocumentDirectory = await getApplicationDocumentsDirectory();
  Hive.init(appDocumentDirectory.path);

  // 注册你的Hive类型(假设你有一个名为User的模型)
  await Hive.registerAdapter(UserAdapter());

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

假设你有一个名为User的Hive模型类,以及相应的UserAdapter

import 'package:hive/hive.dart';

part 'user.g.dart';

@HiveType(typeId: 0)
class User extends HiveObject {
  @HiveField(0)
  String name;

  @HiveField(1)
  int age;

  User(this.name, this.age);
}

生成user.g.dart文件需要运行flutter pub run build_runner build命令。这需要使用build_runner包,所以确保你的dev_dependencies中有以下依赖:

dev_dependencies:
  build_runner: ^2.0.4  # 请检查最新版本号
  hive_generator: ^1.1.0  # 请检查最新版本号

现在,你可以在你的应用程序中使用Hive来存储和检索数据。例如,在HomePage中:

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'user.dart';  // 导入你的User类

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  Box<User> _userBox;

  @override
  void initState() {
    super.initState();
    // 打开一个Hive Box来存储User对象
    _userBox = Hive.box<User>('users');

    // 添加一些初始数据(可选)
    _addInitialData();
  }

  void _addInitialData() {
    var user1 = User('Alice', 30);
    var user2 = User('Bob', 25);
    _userBox.add(user1);
    _userBox.add(user2);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Hive Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Users:'),
            Expanded(
              child: ListView.builder(
                itemCount: _userBox.length,
                itemBuilder: (context, index) {
                  var user = _userBox.getAt(index);
                  return ListTile(
                    title: Text('${user.name}, ${user.age}'),
                  );
                },
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 添加新用户
          var newName = 'Charlie';
          var newAge = 22;
          var newUser = User(newName, newAge);
          _userBox.add(newUser);
          setState(() {}); // 更新UI
        },
        tooltip: 'Add User',
        child: Icon(Icons.add),
      ),
    );
  }
}

这个示例展示了如何使用Hive在Flutter应用程序中存储和检索用户数据。你可以根据需要扩展和修改这个示例。

回到顶部