如何备份和恢复颤振Hive数据使用JSON格式?



我想使用Hive创建一个密码管理器,并且可以选择备份数据或将备份文件发送到另一台设备以将数据复制到新设备。我能够成功地将我的数据备份到JSON文件。

My model class:

import 'package:hive/hive.dart';
part 'password.g.dart';
@HiveType(typeId: 0)
class Password extends HiveObject {
@HiveField(0)
late String website;
@HiveField(1)
late String email;
@HiveField(2)
late String pd;
Map<String, String> toJson() => {
'website': website,
'email': email,
'pd': pd,
};
}

创建一个备份,我使用:

Future<void> createBackup() async {
if (Hive.box<Password>('passwords').isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('No Password Stored.')),
);
return;
}
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Creating backup...')),
);
Map<String, dynamic> map = Hive.box<Password>('passwords')
.toMap()
.map((key, value) => MapEntry(key.toString(), value));
String json = jsonEncode(map);
Directory dir = await _getDirectory();
String formattedDate = DateTime.now()
.toString()
.replaceAll('.', '-')
.replaceAll(' ', '-')
.replaceAll(':', '-');
String path = '${dir.path}$formattedDate.json';
File backupFile = File(path);
await backupFile.writeAsString(json);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Backup saved in folder Passman')),
);
}
Future<Directory> _getDirectory() async {
const String pathExt = '/Passman/';
Directory newDirectory = Directory('/storage/emulated/0/' + pathExt);
if (await newDirectory.exists() == false) {
return newDirectory.create(recursive: true);
}
return newDirectory;
}

运行这段代码给了我一个。json备份文件在根目录下的/Passman/文件夹,但现在我不知道如何使用该文件将数据恢复到Hive。

我能够使用下面的代码从我创建的备份进行恢复。我用了这个包。

Future<void> restoreBackup() async {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Restoring backup...')),
);
FilePickerResult? file = await FilePicker.platform.pickFiles(
type: FileType.any,
);
if (file != null) {
File files = File(file.files.single.path.toString());
Hive.box<Password>('passwords').clear();
Map<String, dynamic> map = jsonDecode(await files.readAsString());
for (var i = 0; i < map.length; i++) {
Password password = Password.fromJson(i.toString(), map);
Hive.box<Password>('passwords').add(password);
}
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Restored Successfully...')),
);}
}