Commit 9b5d3b0
Changed files (4)
lib
l10n
screens
subsettings
lib/l10n/app_en.arb
@@ -94,6 +94,7 @@
"exportCsvHeadlineDesc": "Helps to discriminate types",
"csv": "CSV",
"pdf": "PDF",
+ "db": "SQLITE DB",
"text": "text",
"other": "other",
"fieldDelimiter": "field delimiter",
lib/model/export_import.dart
@@ -1,10 +1,13 @@
import 'dart:convert';
+import 'dart:io';
import 'dart:typed_data';
import 'package:blood_pressure_app/model/pdf_creator.dart';
import 'package:blood_pressure_app/model/settings_store.dart';
import 'package:csv/csv.dart';
+import 'package:path/path.dart';
+import 'package:sqflite/sqflite.dart';
import 'blood_pressure.dart';
@@ -14,59 +17,65 @@ class DataExporter {
DataExporter(this.settings);
Future<Uint8List> createFile(List<BloodPressureRecord> records) async {
- if (settings.exportFormat == ExportFormat.csv) {
- List<String> exportItems;
- if (settings.exportCustomEntries) {
- exportItems = settings.exportItems;
- } else {
- exportItems = ['timestampUnixMs', 'systolic', 'diastolic', 'pulse', 'notes'];
- }
+ switch (settings.exportFormat) {
+ case ExportFormat.csv:
+ return createCSVCFile(records);
+ case ExportFormat.pdf:
+ return await PdfCreator().createPdf(records);
+ case ExportFormat.db:
+ return copyDBFile();
+ }
+ }
- var csvHead = '';
- if (settings.exportCsvHeadline) {
- for (var i = 0; i<exportItems.length; i++) {
- csvHead += exportItems[i];
- if (i<(exportItems.length - 1)) {
- csvHead += settings.csvFieldDelimiter;
- }
+ Uint8List createCSVCFile(List<BloodPressureRecord> records) {
+ List<String> exportItems;
+ if (settings.exportCustomEntries) {
+ exportItems = settings.exportItems;
+ } else {
+ exportItems = ['timestampUnixMs', 'systolic', 'diastolic', 'pulse', 'notes'];
+ }
+
+ var csvHead = '';
+ if (settings.exportCsvHeadline) {
+ for (var i = 0; i<exportItems.length; i++) {
+ csvHead += exportItems[i];
+ if (i<(exportItems.length - 1)) {
+ csvHead += settings.csvFieldDelimiter;
}
- csvHead += '\r\n';
}
+ csvHead += '\r\n';
+ }
- List<List<dynamic>> items = [];
- for (var record in records) {
- List<dynamic> row = [];
- for (var attribute in exportItems) {
- switch (attribute) {
- case 'timestampUnixMs':
- row.add(record.creationTime.millisecondsSinceEpoch);
- break;
- case 'isoUTCTime':
- row.add(record.creationTime.toIso8601String());
- break;
- case 'systolic':
- row.add(record.systolic);
- break;
- case 'diastolic':
- row.add(record.diastolic);
- break;
- case 'pulse':
- row.add(record.pulse);
- break;
- case 'notes':
- row.add(record.notes);
- break;
- }
+ List<List<dynamic>> items = [];
+ for (var record in records) {
+ List<dynamic> row = [];
+ for (var attribute in exportItems) {
+ switch (attribute) {
+ case 'timestampUnixMs':
+ row.add(record.creationTime.millisecondsSinceEpoch);
+ break;
+ case 'isoUTCTime':
+ row.add(record.creationTime.toIso8601String());
+ break;
+ case 'systolic':
+ row.add(record.systolic);
+ break;
+ case 'diastolic':
+ row.add(record.diastolic);
+ break;
+ case 'pulse':
+ row.add(record.pulse);
+ break;
+ case 'notes':
+ row.add(record.notes);
+ break;
}
- items.add(row);
}
- var converter = ListToCsvConverter(fieldDelimiter: settings.csvFieldDelimiter, textDelimiter: settings.csvTextDelimiter);
- var csvData = converter.convert(items);
- return Uint8List.fromList(utf8.encode(csvHead + csvData));
- } else if (settings.exportFormat == ExportFormat.pdf) {
- return await PdfCreator().createPdf(records);
+ items.add(row);
}
- return Uint8List(0);
+ var converter = ListToCsvConverter(fieldDelimiter: settings.csvFieldDelimiter, textDelimiter: settings.csvTextDelimiter);
+ var csvData = converter.convert(items);
+ return Uint8List.fromList(utf8.encode(csvHead + csvData));
}
List<BloodPressureRecord> parseCSVFile(Uint8List data) {
@@ -126,9 +135,20 @@ class DataExporter {
}
return records;
}
+
+ Future<Uint8List> copyDBFile() async {
+ var dbPath = await getDatabasesPath();
+
+ if (dbPath != inMemoryDatabasePath) {
+ dbPath = join(dbPath, 'blood_pressure.db');
+ }
+ return File(dbPath).readAsBytes();
+
+ }
}
enum ExportFormat {
csv,
- pdf
+ pdf,
+ db
}
\ No newline at end of file
lib/model/settings_store.dart
@@ -279,6 +279,8 @@ class Settings extends ChangeNotifier {
return ExportFormat.csv;
case 1:
return ExportFormat.pdf;
+ case 2:
+ return ExportFormat.db;
default:
assert(false);
return ExportFormat.csv;
@@ -293,6 +295,9 @@ class Settings extends ChangeNotifier {
case ExportFormat.pdf:
_prefs.setInt('exportFormat', 1);
break;
+ case ExportFormat.db:
+ _prefs.setInt('exportFormat', 2);
+ break;
default:
assert(false);
}
lib/screens/subsettings/export_import_screen.dart
@@ -75,6 +75,7 @@ class _ExportImportScreenState extends State<ExportImportScreen> {
items: [
DropdownMenuItem(value: ExportFormat.csv, child: Text(AppLocalizations.of(context)!.csv)),
DropdownMenuItem(value: ExportFormat.pdf, child: Text(AppLocalizations.of(context)!.pdf)),
+ DropdownMenuItem(value: ExportFormat.db, child: Text(AppLocalizations.of(context)!.db)),
],
onChanged: (ExportFormat? value) {
if (value != null) {
@@ -146,8 +147,8 @@ class _ExportImportScreenState extends State<ExportImportScreen> {
];
}
- // warn banner when
- if (_showWarnBanner && (settings.exportFormat != ExportFormat.csv ||
+ // warn banner when the exported data can't be imported
+ if (_showWarnBanner && ![ExportFormat.csv, ExportFormat.db].contains(settings.exportFormat) ||
settings.exportCsvHeadline == false ||
!(
(settings.exportItems.contains('timestampUnixMs') || settings.exportItems.contains('isoUTCTime')) &&
@@ -156,7 +157,7 @@ class _ExportImportScreenState extends State<ExportImportScreen> {
settings.exportItems.contains('pulse') &&
settings.exportItems.contains('notes')
)
- )) {
+ ) {
options.insert(0, MaterialBanner(
padding: const EdgeInsets.all(20),
content: Text(AppLocalizations.of(context)!.exportWarnConfigNotImportable),
@@ -208,13 +209,17 @@ class _ExportImportScreenState extends State<ExportImportScreen> {
}
var fileContents = await DataExporter(settings).createFile(entries);
- String filename = 'blood_press_${DateTime.now().toIso8601String()}'
+ String filename = 'blood_press_${DateTime.now().toIso8601String()}';
switch(settings.exportFormat) {
case ExportFormat.csv:
filename += '.csv';
break;
case ExportFormat.pdf:
filename += '.pdf';
+ break;
+ case ExportFormat.db:
+ filename += '.db';
+ break;
}
String path = await FileSaver.instance.saveFile(name: filename, bytes: fileContents);