「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」。
本文本翻译自 moor2csv | Flutter Package (pub.dev)。
moor2csv
支持 SQL/Moor 的包,可用来简单地把基于 SQL 的 Moor 数据库导出为 CSV格式,可用于外部存储或分享。除了 Web,支持所有平台。
使用准备
首先,需要在开发用的设备上做一些必要的步骤来提供存储能力。例:对于 Adnroid 是android\app\src\main\AndroidManifest.xml 和 提供权限 。
-
在 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; -
运行一个查询从数据库中获取
List<DataClass项目。 例:异步async函数中的List<Employee> _employees = await db.getAllEmployees();从数据库db中为我们获取List<DataClass>项目. -
传递
List<DataClass>对象作为MoorSQLtoCSV的来简单地创建一个MoorSQLtoCSV对象(还有一个可选项是要保存的 csv 文件名),然后它会做所有用于导出数据库到 csv 文件的必要工作。示例是在employees.csv文件中存储了一个 Employee table类型的对象_employees:_csvGenerator = MoorSQLToCSV(_employees, csvFileName: 'employees'); // Dart 字段会保存为 Iso8601 字符串 -
可选的, 访问
MoorSQLtoCSV对象成员的wasCreated成员的 getter 来获取一个Future<bool>来判定 csv 文件是否已被生成。然后pathToCSVDirectory的 getter 可获取生成(只要生成过一次)的 csv 文件所在的目录。 -
如果数据库被成功创建,会在下面的位置发现它:
a. Android and IoS: Flutter App 的内部存储目录(例如:Android 上是是
Android\Data\com.*.*\appName),提供许可的权限会成功生成 csv 。
b. Desktop Systems: 下载目录。
依赖
-
已带有数据 库和表。
Moor 需要moor_generator和build_runner的依赖来使用完整功能。在使用之前确保你已经熟悉这个包。 -
提供下载目录(桌面)的路径和 APP 的内部存储目录(移动平台),这是允许存储文件的唯一位置。
-
在移动设备上提供读写权限, moor 本身也需要它。
-
也使用
dart:io库用于文件操作
可用的方法
-
MoorSQLToCSV (类的构造方法):
调用时需要带一个 List 参数用来直接生成 csv。
一个可选的参数 csvFileName:提供保存生成文件的文件名(需要带扩展名.csv) -
wasCreated (getter):
Future<bool>发出文件是否被成功创建的信号。 -
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;
}