#android #flutter #dart #flutter-hive
Вопрос:
Я хочу создать менеджер паролей с помощью Hive и иметь возможность создавать резервные копии данных или отправлять файл резервной копии на другое устройство для копирования данных на новое устройство. Мне удалось успешно создать резервную копию своих данных в файл JSON.
Мой класс моделей:
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/ в корневой папке, но теперь я понятия не имею, как использовать этот файл для восстановления данных обратно в улей.
Комментарии:
1. Пожалуйста, прочитайте, для чего используется тег[hive]. Он используется для Apache Hive — хранилища данных в Hadoop. Это не имеет ничего общего с f]lutter] и [флаттер-ульем]
2. Извините за это, я новичок в улье флаттер.
Ответ №1:
Я смог восстановить из резервной копии, которую я создал, используя приведенный ниже код. Я использовал этот пакет.
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...')),
);}
}