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)
据我所知,还没有一个“开箱即用”的解决方案。这在很大程度上取决于您想要如何做到这一点的用例(因为有很多方法)。有关我如何为我的应用程序执行此操作的完整示例,您可以在这里查看: 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 上的外部存储)或使用共享包是可能的解决方案。
| 归档时间: |
|
| 查看次数: |
6558 次 |
| 最近记录: |