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

Posted

技术标签:

【中文标题】如何使用 JSON 格式备份和恢复 Flutter Hive 数据?【英文标题】:How to Backup and Restore Flutter Hive Data using JSON format? 【发布时间】:2021-10-25 20:20:04 【问题描述】:

我想使用 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;
  

运行此代码在根目录的 /Passman/ 文件夹中为我提供了一个 .json 备份文件,但现在我不知道如何使用该文件将数据恢复回 Hive。

【问题讨论】:

请阅读 [hive] 标签的用途。它用于 Apache Hive - Hadoop 中的数据仓库。它与 f]lutter] 和 [flutter-hive] 没有任何共同之处 对不起,我是新来的flutter hive。 【参考方案1】:

我能够从使用以下代码创建的备份中恢复。我使用了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...')),
  );

【讨论】:

以上是关于如何使用 JSON 格式备份和恢复 Flutter Hive 数据?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB备份与恢复

MongoDB备份与恢复

MongoDB数据库的备份恢复

备份文件如何恢复系统

mongodump与mongorestore的使用示例

mongodump与mongorestore的使用示例