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
相关产品推荐
相关产品推荐

