flutter数据保存实体之Hive(一)

Hive 是一个轻量级、高性能的 NoSQL 本地数据库,支持类型安全和快速读写。

  1. 添加依赖
    在 pubspec.yaml 中添加 Hive 和代码生成相关依赖:
dependencies:
  flutter:
    sdk: flutter
  hive: ^2.2.3
  hive_flutter: ^1.1.0

dev_dependencies:
  hive_generator: ^2.0.0
  build_runner: ^2.3.3

运行 flutter pub get 安装依赖。


  1. 初始化 Hive
    在 main.dart 中初始化 Hive,并注册适配器(用于序列化实体类):
import 'package:hive_flutter/hive_flutter.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();
  
  // 注册实体类的适配器(需提前生成)
  Hive.registerAdapter(UserAdapter()); 
  
  runApp(MyApp());
}

  1. 创建实体类并生成适配器
    实体类示例 (user.dart)
import 'package:hive/hive.dart';

part 'user.g.dart'; // 代码生成文件

@HiveType(typeId: 0)
class User {
  @HiveField(0)
  final String id;

  @HiveField(1)
  final String name;

  @HiveField(2)
  final int age;

  User({required this.id, required this.name, required this.age});
}

生成适配器
运行以下命令生成 UserAdapter:

flutter pub run build_runner build

这会生成 user.g.dart,包含 UserAdapter 的实现。


  1. 封装 Hive 工具类
    创建一个通用工具类 HiveHelper.dart,支持任意实体类的存储和操作:
import 'package:hive/hive.dart';

class HiveHelper<T> {
  final String boxName;
  Box<T>? _box;

  HiveHelper({required this.boxName});

  // 初始化并打开盒子
  Future<void> init() async {
    _box = await Hive.openBox<T>(boxName);
  }

  // 添加或更新数据
  Future<void> put(String key, T value) async {
    await _box?.put(key, value);
  }

  // 获取数据
  T? get(String key) {
    return _box?.get(key);
  }

  // 删除数据
  Future<void> delete(String key) async {
    await _box?.delete(key);
  }

  // 获取全部数据
  List<T> getAll() {
    return _box?.values.toList() ?? [];
  }

  // 清空盒子
  Future<void> clear() async {
    await _box?.clear();
  }

  // 关闭盒子
  Future<void> close() async {
    await _box?.close();
  }
}

  1. 使用示例
    初始化并存储数据

// 初始化工具类(User 为实体类)
final userHelper = HiveHelper<User>(boxName: 'userBox');
await userHelper.init();

// 存储用户数据
final user = User(id: '1', name: 'Alice', age: 25);
await userHelper.put(user.id, user);

// 获取用户数据
User? savedUser = userHelper.get('1');
print(savedUser?.name); // 输出: Alice

// 获取全部用户
List<User> allUsers = userHelper.getAll();

// 删除用户
await userHelper.delete('1');

  1. 高级功能
    监听数据变化

userHelper._box?.listenable().addListener(() {
  print('Box 数据发生变化!');
});

使用 LazyBox(延迟加载)

final lazyBox = await Hive.openLazyBox('lazyBox');
await lazyBox.put('key', heavyData); // 延迟加载数据

加密数据

import 'package:hive/hive.dart';

final encryptionKey = Hive.generateSecureKey();
final encryptedBox = await Hive.openBox(
  'encryptedBox',
  encryptionCipher: HiveAesCipher(encryptionKey),
);

  1. 注意事项
    类型 ID 唯一性:确保每个实体类的 typeId 唯一,避免冲突。**

适配器注册:必须在 Hive.initFlutter() 后注册适配器。

盒子管理:及时关闭不再使用的盒子以释放资源。

数据迁移:修改实体类字段时,需处理旧数据兼容性(如使用 @HiveField 的 defaultValue)。


通过以上封装,可以高效管理本地数据存储,适用于用户配置、缓存、小型数据集等场景。根据需求扩展工具类功能(如分页查询、批量操作等)。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容