Flutter dart 将 hive 保存的数据导出到文件以便稍后检索

Hen*_*rik 7 dart flutter flutter-hive

我正在开发一个条形码应用程序并将数据保存到配置单元。我需要知道的是,有一种方法可以将保存的配置单元数据库导出到备份文件,并能够在应用程序崩溃或手机丢失时检索它。这是为了盲人可达性。想要将数据导出到一个文件,我可以将其保存到我的电脑上进行存储,如果发生问题,我不必再次扫描所有产品来构建数据库。如果 hive 不能做到这一点,有人可以向我指出哪个 flutter dart 数据库可以做到这一点。谢谢

好吧,答案对我不起作用。这是我的模型文件的副本

    import 'package:hive/hive.dart';

    part 'product.g.dart';
    @HiveType(typeId: 0)
    class Product extends HiveObject{
      @HiveField(0)
      String itemName;
      @HiveField(1)
      String barCode;
      @HiveField(2)
      String bcType;

      Product(this.itemName, this.barCode, this.bcType);
    }
Run Code Online (Sandbox Code Playgroud)

然后我像 var box = Hive.box('products'); 这样调用我的盒子

如何将其编码为json以保存?

我用下一个

    Future<File> _createBackupFile() async {
      /// This example uses the OS temp directory
Run Code Online (Sandbox Code Playgroud)

文件 backupFile = File('${Directory.systemTemp.path}/backup_barcode.json');

      try {
        /// barcodeBox is the [Box] object from the Hive package, usually exposed inside a [ValueListenableBuilder] or via [Hive.box()]
    var barcodeBox = Hive.box<Product>('products');
       backupFile = await backupFile.writeAsString(jsonEncode(barcodeBox.values));

        return backupFile;
      } catch (e) {
        // TODO: handle exception
    print(e);
      }
    }
Run Code Online (Sandbox Code Playgroud)

kou*_*nex 4

据我所知,还没有一个“开箱即用”的解决方案。这在很大程度上取决于您想要如何做到这一点的用例(因为有很多方法)。有关我如何为我的应用程序执行此操作的完整示例,您可以在这里查看: https://github.com/Kounex/obs_blade/blob/master/lib/views/settings/logs/log_detail/log_detail.dart (我使用共享包以便轻松导出它 - 但这不是必需的)

Flutter 也有自己的关于读写文件的文档(https://flutter.dev/docs/cookbook/persistence/reading-writing-files) - 我将添加一些信息来总结它:

存储位置


首先我们要考虑把“备份文件”存放在哪里。Flutter 自行公开了可供您使用的通用路径(此外,path_provider包还为您提供了更大的灵活性)。如果您希望此备份文件是临时的,您可以使用:

Directory.systemTemp;
Run Code Online (Sandbox Code Playgroud)

文档指出:“这是操作系统提供的用于创建临时文件和目录的目录。” 操作系统会确保在不同的情况下删除它们,因此您不必担心。您还可以在此临时目录中创建其他目录以使其更易于区分,例如:

Directory.systemTemp.createTemp('my_app');
Run Code Online (Sandbox Code Playgroud)

重要提示:这适用于非敏感数据。如果您正在处理的任何内容包含敏感数据(如姓名、地址等),您必须确保数据安全/数据隐私。在这种情况下,我将使用前面提到的 path_provider 包,并在文档目录 ( getApplicationDocumentsDirectory()) 中创建这些文件,并确保它们在使用/导出后立即删除。即使对内容进行加密也可能是个好主意 - 但我不会在这里深入探讨这一点。

文件管理


一旦我们知道在哪里存储文件,我们只需要创建它们。之前 flutter 文档的第 3 章和第 4 章准确地说明了如何做到这一点,所以我更关注要写什么。

JSON 是一种常见且非常方便的数据组合方式。Flutter 也有相关文档:https ://flutter.dev/docs/development/data-and-backend/json

由于您使用的是 Hive,因此您可能已经有了表示框中条目的类,并且您可以轻松地添加toJson()返回 a 的函数Map<String, dynamic>(如文档中所示),然后您可以使用它最终将所需的信息写入文件中。

根据您的 Hive 类,以下是如何在 otder 中调整它以正确序列化它:

import 'package:hive/hive.dart';

part 'product.g.dart';

@HiveType(typeId: 0)
class Product extends HiveObject{
  @HiveField(0)
  String itemName;

  @HiveField(1)
  String barCode;

  @HiveField(2)
  String bcType;

  Product(this.itemName, this.barCode, this.bcType);

  /// This function will automatically be used by the [jsonEncode()] function internally
  Map<String, dynamic> toJson() => {
    'itemName': this.itemName,
    'barCode': this.barCode,
    'bcType': this.bcType,
  }
}
Run Code Online (Sandbox Code Playgroud)

一个小示例实现可能如下所示:

Future<File?> _createBackupFile() async {
  /// This example uses the OS temp directory
  File backupFile = File('${Directory.systemTemp.path}/backup_barcode.json');

  try {
    /// barcodeBox is the [Box] object from the Hive package, usually exposed inside a [ValueListenableBuilder] or via [Hive.box()]
    backupFile = await backupFile.writeAsString(jsonEncode(barcodeBox.values));

    return backupFile;
  } catch (e) {
    // TODO: handle exception
  }
}
Run Code Online (Sandbox Code Playgroud)

这会将 Hive 盒的 JSON 表示形式保存在临时操作系统目录中。您可以将目录交换为最适合您的目录(例如在 Android 上,在外部存储上以方便访问)。

现在您必须考虑如何以及何时触发此操作。例如,您可以通过触发按钮手动执行此操作,也可以在执行特定操作(例如添加新条形码)后自动执行此操作,并选择适合您访问文件的方式。如前所述,将文件保存在易于访问的位置(例如 Android 上的外部存储)或使用共享包是可能的解决方案。

  • 给出将对象转换为可编码对象失败:'MappedIterable&lt;Frame, Product&gt;'的实例,不确定我做错了什么。谢谢 (2认同)