[译]Flutter的drift(moor)数据库导出csv文件的包moor2csv

11,086 阅读2分钟

「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」。

本文本翻译自 moor2csv | Flutter Package (pub.dev)


moor2csv

支持 SQL/Moor 的包,可用来简单地把基于 SQL 的 Moor 数据库导出为 CSV格式,可用于外部存储或分享。除了 Web,支持所有平台。

使用准备

首先,需要在开发用的设备上做一些必要的步骤来提供存储能力。例:对于 Adnroid 是android\app\src\main\AndroidManifest.xml提供权限

  1. 在 Flutter 工程中安装 Moor 数据库,然后创建所需的数据结构和表。例:

     import 'package:moor/moor.dart';
     import 'package:undo/undo.dart';
    
     // ****** Employee 数据结构,对应表 *****
     class Employees extends Table {
       TextColumn get employeeID => text()();
       TextColumn get name => text().withLength(max: 100).nullable()();
       IntColumn get phoneNo => integer().nullable()();
       TextColumn get deviceID => text().nullable()();
       @override
       Set<Column> get primaryKey => {employeeID};
     }
    
        // ****** Moor 准备 ********
    
        part 'Database.g.dart';
    
        @UseMoor(tables: [Employees])
        class Database extends _$Database {
          Database(QueryExecutor e) : super(e);
          final cs = ChangeStack();
    
          @override
          int get schemaVersion => 1;
    
          Future<List<Employee>> getAllEmployees() => select(employees).get();
          ...
        } db;
    
  2. 运行一个查询从数据库中获取 List<DataClass 项目。 例:异步 async 函数中的 List<Employee> _employees = await db.getAllEmployees(); 从数据库  db 中为我们获取 List<DataClass> 项目.

  3. 传递 List<DataClass> 对象作为 MoorSQLtoCSV 的来简单地创建一个 MoorSQLtoCSV 对象(还有一个可选项是要保存的 csv 文件名),然后它会做所有用于导出数据库到 csv 文件的必要工作。示例是在 employees.csv 文件中 存储了一个 Employee table 类型的对象 _employees:

    _csvGenerator = MoorSQLToCSV(_employees, csvFileName: 'employees'); // Dart 字段会保存为  Iso8601 字符串
    
  4. 可选的, 访问 MoorSQLtoCSV 对象成员的 wasCreated 成员的 getter 来获取一个 Future<bool> 来判定 csv 文件是否已被生成。然后 pathToCSVDirectory 的 getter 可获取生成(只要生成过一次)的 csv 文件所在的目录。

  5. 如果数据库被成功创建,会在下面的位置发现它:

    a. Android and IoS:  Flutter App 的内部存储目录(例如:Android 上是是 Android\Data\com.*.*\appName ),提供许可的权限会成功生成 csv 。

b. Desktop Systems:  下载目录。

依赖

  1. Moor

    已带有数据 库和表。
    Moor 需要 moor_generator 和 build_runner 的依赖来使用完整功能。在使用之前确保你已经熟悉这个包。

  2. Path Provider

    提供下载目录(桌面)的路径和 APP 的内部存储目录(移动平台),这是允许存储文件的唯一位置。

  3. Permission Handler

    在移动设备上提供读写权限, moor 本身也需要它。

  4. 也使用 dart:io 库用于文件操作

可用的方法

  1. MoorSQLToCSV (类的构造方法):

    调用时需要带一个 List 参数用来直接生成 csv。
    一个可选的参数 csvFileName:提供保存生成文件的文件名(需要带扩展名 .csv)

  2. wasCreated (getter):

    Future<bool> 发出文件是否被成功创建的信号。

  3. pathToCSVDirectory (getter):

    提供一个存储生成文件的路径或目录。

示例用法

Future<bool> exportDatabase() async {
  bool didSucceed = false;
  List<Employee>_employees = await db.getAllEmployees();

  if (_employees.isNotEmpty) {
    MoorSQLToCSV _csvGenerator = MoorSQLToCSV(_employees, csvFileName: 'employees');
    didSucceed = await_csvGenerator.wasCreated;
  }
  return didSucceed;
}