You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何获取Hive Box名称?忘记名称后如何恢复数据

找回Hive中忘记名称的Box及数据

方法一:读取存储目录获取所有Box名称

Hive的每个Box对应存储目录下一个.hive后缀的文件,文件名就是Box的原始名称。你已经通过getApplicationDocumentsDirectory()指定了存储路径,直接遍历该目录即可提取所有Box名称:

  • 遍历目录下的文件,筛选出.hive后缀的文件
  • 去掉文件名的.hive后缀,得到Box名称

方法二:遍历打开所有Box读取数据

拿到所有Box名称后,逐个打开并读取数据,就能定位到你需要的原始数据。

以下是完整代码示例:

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;

// 你的模型类及适配器(保留原有实现即可)
class CategoryModel {}
class CategoryModelAdapter extends TypeAdapter<CategoryModel> {
  @override
  final typeId = 0;
  @override
  CategoryModel read(BinaryReader reader) => CategoryModel();
  @override
  void write(BinaryWriter writer, CategoryModel obj) {}
}

class TransactionModel {}
class TransactionModelAdapter extends TypeAdapter<TransactionModel> {
  @override
  final typeId = 1;
  @override
  TransactionModel read(BinaryReader reader) => TransactionModel();
  @override
  void write(BinaryWriter writer, TransactionModel obj) {}
}

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Directory dir = await getApplicationDocumentsDirectory();
  await Hive.initFlutter(dir.path);
  Hive.registerAdapter<CategoryModel>(CategoryModelAdapter());
  Hive.registerAdapter<TransactionModel>(TransactionModelAdapter());

  // 提取所有Box名称
  final boxFiles = dir.listSync().where((entity) => entity.path.endsWith('.hive')).toList();
  final allBoxNames = boxFiles.map((file) {
    final fileName = path.basename(file.path);
    return fileName.replaceAll('.hive', '');
  }).toList();

  // 遍历打开每个Box并读取数据
  for (final boxName in allBoxNames) {
    try {
      // 先以dynamic类型打开,避免类型不匹配报错
      final box = await Hive.openBox<dynamic>(boxName);
      print('Box [$boxName] 数据:${box.values.toList()}');

      // 确认类型后可指定泛型打开
      // final transactionBox = await Hive.openBox<TransactionModel>(boxName);
      // print('交易数据:${transactionBox.values.toList()}');
    } catch (e) {
      print('打开Box [$boxName] 失败:$e');
    }
  }

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('Hive Box 找回'))));
  }
}

注意事项

  • 如果Box设置了加密,打开时需要传入对应密钥,否则会抛出解密异常
  • 通过打印的数据结构,可以快速定位到你之前使用的原始Box,之后修改代码固定该名称即可

内容的提问来源于stack exchange,提问作者user22362195

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:52:38