如何使用 JSON 格式备份和恢复 Flutter Hive 数据?
How to Backup and Restore Flutter Hive Data using JSON format?
我想使用 Hive 创建一个密码管理器,并可以选择备份数据或将备份文件发送到另一台设备以将数据复制到新设备。我能够成功地将我的数据备份到 JSON 文件。
我的模型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;
}
运行 此代码在根目录的 /Passman/ 文件夹中为我提供了一个 .json 备份文件,但现在我不知道如何使用该文件将数据恢复到 Hive .
我能够使用下面的代码从我创建的备份中恢复。我使用了 this 包。
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...')),
);}
}
我想使用 Hive 创建一个密码管理器,并可以选择备份数据或将备份文件发送到另一台设备以将数据复制到新设备。我能够成功地将我的数据备份到 JSON 文件。
我的模型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;
}
运行 此代码在根目录的 /Passman/ 文件夹中为我提供了一个 .json 备份文件,但现在我不知道如何使用该文件将数据恢复到 Hive .
我能够使用下面的代码从我创建的备份中恢复。我使用了 this 包。
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...')),
);}
}