Как создать резервную копию и восстановить данные Flutter Hive в формате JSON?

#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...')),
  );}
}